2012-08-14 40 views
5

サードパーティのC++プログラムを実行している間、私は次のエラーを取得:共有ライブラリの読み込み中にエラーが発生しました:libgomp.so.1:、GCCバージョンが間違っていますか?

エラーを共有ライブラリをロード中:libgomp.so.1:共有オブジェクトファイルを開くことはできません:そのようなファイルまたはディレクトリ

libgomp.soを.1ライブラリは、GNUコンパイラのコレクションOpenMPランタイムライブラリです。

この部分はGCCパッケージですか? gcc-4.5のシステムでプログラムを実行できますが、gcc-4.3またはgcc-4.6のシステムでは実行できません。

他のパッケージをインストールする必要はありますか?

gcc-4.3を使ってライブラリをダウンロードしてLD_LIBRARY_PATHに置くと、これを手作業で修正しようとしましたが、別のライブラリが見つかりました:/usr/lib/libstdc++.so.6:version `GLIBCXX_3 .4.11 'が見つかりません。 libstdcはGNU標準C++ライブラリなので、GCCのバージョンも間違っていますか?

私はC++開発者ではないので、これらのライブラリが何であるか、そしてC++コードでライブラリが一般的にどのように機能するかは完全にはわかりません。

osはLinux 64ビットです。

のgcc-4.3マシン:openSUSEの11.1

のgcc-4.5マシン:openSUSEの11.4(このマシンでプログラムが動作します)

のgcc-4.6マシン:openSUSEの12.1

+0

私はそのシステム上でlinuxを想定しています。実際の配布とは何ですか? – unkulunkulu

+0

プログラムは64ビットですか? –

答えて

3

プログラムはlibgomp(libgomp.so.1)の特定のバージョンとリンクされており、そのプログラムでのみ使用できます。

  • は静的に取得し、

    1. はGCCの新しいバージョンに対してコンパイルされたアプリケーションの別のバージョンを入手し、アプリケーションのソースコードを入手し、あなたのシステムのためにそれを自分でコンパイルします。だから、どちらかしな​​ければなりませんアプリケーションのリンクバージョン、
    2. お使いのディストリビューションは、並列にlibgompの古いバージョンをインストールすることをサポートしている場合は、
    3. それは、あなたがまだ古いlibgompバイナリをつかむことができ、好ましくは、(あなたの/usr/libに入れていない場合は、 /usr/local/libパスの場合は/etc/ld.so.conf
    4. 最後に、可能であれば、gccを古いバージョンにダウングレードして動作させることができます。しかし、それは悪い、短時間の解決策です。
  • 1

    は、あなたのプログラムがコンパイルされたようですgcc-4.5を使用してリンクすると、4.5より前のバージョンに移植する頭痛があることを意味します。ディストリビューション(Linuxを前提とする)内の依存関係は、clibやC++ libのようなコアライブラリの次のメジャーバージョンには容易に持ち込まれません。あなたのgcc-4.3ボックスの次のLinuxディストリビューションへの標準アップグレードを行う方がはるかに簡単です。

    gcc-4.6マシンでは、libgomp.so.1を含むcompatパッケージを検索する必要があります。これはディストリビューションに依存しており、私はここで詳細を知らない。

    あなたの箱のように、依存関係の情報を抽出するためのツールがあるかもしれません、あなたがcomamnd lddを使って、プログラムのすべての共有ライブラリリンクの依存関係を見ることができます

    man ldd

    +0

    gcc-4.6の場合に役立つrpmパッケージがあります。たとえば、このrpmサイトには[rpm.pbone.net ...]というページがあります(http://rpm.pbone.net/index .php3/stat/3/srodzaj/1/search/libgomp.so.1()(64ビット))。 (またはトラブルを引き起こす可能性があります) – Jojje

    2

    を試してみてください。たとえば、次のように

    $ ldd /bin/ls 
        linux-gate.so.1 => (0xb76fe000) 
        libselinux.so.1 => /lib/i386-linux-gnu/libselinux.so.1 (0xb76be000) 
        librt.so.1 => /lib/i386-linux-gnu/librt.so.1 (0xb76b5000) 
        libacl.so.1 => /lib/i386-linux-gnu/libacl.so.1 (0xb76ab000) 
        libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7506000) 
        libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0xb7501000) 
        /lib/ld-linux.so.2 (0xb76ff000) 
        libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xb74e6000) 
        libattr.so.1 => /lib/i386-linux-gnu/libattr.so.1 (0xb74e0000) 
    

    、あなたは別のマシンでこのプログラムを実行すると、ディレクトリに多くのことをコピーしようとしてからLD_LIBRARY_PATHトリックを使用することができ、共有ライブラリのバージョンに問題があるにしたい場合。しかし、いくつかのライブラリコピーしてはならないことに注意してください。

    • linux-gate.soを:ない本当のファイルが、土地をカーネルにゲートウェイを。
    • /lib/ld-linux-so.2:ダイナミックローダー(ELFインタープリタ)動的にリンクされたすべての実行可能ファイルのヘッダーには、静的な参照があります。コピーしないでください。
    • [/usr]/lib/i386-linux-gnu/*:このディレクトリ内のすべてのものはアーキテクチャ固有のものです。両方のマシンが同じアーキテクチャーを持っているとうまくいくかもしれません。そうでなければ、同じ名前のライブラリを[/usr]/lib/<your-real-arch>/*の下に探す必要があります。

    は、ターゲットマシンで、あなたも期待通りにライブラリが解決されるかどうかを確認するためにexport LD_LIBRARY_PATH=...lddツールを使用することができます。

    関連する問題