7

サードパーティのC++プログラムを実行しているときに、次のエラーが発生します。

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

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

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

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

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

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

OSはLinux64ビットです。

gcc-4.3マシン:openSUSE 11.1

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

gcc-4.6マシン:openSUSE 12.1

4

3 に答える 3

3

comamndを使用すると、プログラムのすべての共有ライブラリにリンクされた依存関係を確認できますldd。例えば:

$ 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>/*

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

于 2012-08-14T09:52:56.863 に答える
3

プログラムはlibgomp(libgomp.so.1)の特定のバージョンに対してリンクされており、そのバージョンでのみ使用できます。したがって、次のいずれかを行う必要があります。

  1. アプリケーションのソースコードを取得し、システム用に自分でコンパイルします。
  2. 新しいバージョンのgccに対してコンパイルされた別のバージョンのアプリケーションを入手します。
  3. 静的にリンクされたバージョンのアプリケーションを入手し、
  4. ディストリビューションがそれをサポートしている場合は、古いバージョンのlibgompを並行してインストールします。
  5. そうでない場合でも、古いlibgompバイナリを取得して、/usr/lib(できれ/usr/local/libば、そのパスがにある場合は/etc/ld.so.conf)に入れることができます。
  6. そして最後に、それが可能であれば、gccを古いバージョンにダウングレードして機能させることができます。しかし、それは悪い、短時間の解決策です。
于 2012-08-14T09:53:11.683 に答える
1

プログラムはgcc-4.5を使用してコンパイルおよびリンクされているようです。つまり、4.5より前のバージョンにプログラムを移植するのは面倒です。ディストリビューション内の依存関係(Linuxを想定)は、clibやc++libなどのコアライブラリの次のメジャーバージョンに簡単に移行することはできません。gcc-4.3ボックスを次のLinuxディストリビューションリリースに標準アップグレードする方がはるかに簡単です。

gcc-4.6マシンの場合、libgomp.so.1を含むcompatパッケージを検索する必要があるかもしれません。これはディストリビューションに依存しており、ここで詳細はわかりません。

あなたの箱の依存関係情報を抽出するためのツールがあるかもしれません、試してみてください

man ldd

于 2012-08-14T09:51:49.753 に答える