10

Intel のIPPライブラリを使用する C++ アプリケーションを構築しています。このライブラリはデフォルトで /opt にインストールされ、ソフトウェアのコンパイルと実行の両方を設定する必要がありますLD_LIBRARY_PATH(共有ライブラリ リンクを選択した場合は、私が実行しました)。コンパイル時にその変数を設定する必要がないようにconfigure.ac/を既に変更しましたが、実行時に共有ライブラリを見つけることができません。Makefile.amそれ、どうやったら出来るの?

-Wl, -R/path/to/libdirフラグを使用してコンパイルしていますg++

更新 1 : 実際、私のバイナリ プログラムにはいくつかの IPP ライブラリが正しくリンクされていますが、1 つだけではありません。

$ ldd myprogram
linux-vdso.so.1 =>  (0x00007fffa93ff000)
libippacem64t.so.6.0 => /opt/intel/ipp/6.0.2.076/em64t/sharedlib/libippacem64t.so.6.0 (0x00007f22c2fa3000)
libippsem64t.so.6.0 => /opt/intel/ipp/6.0.2.076/em64t/sharedlib/libippsem64t.so.6.0 (0x00007f22c2d20000)
libippcoreem64t.so.6.0 => /opt/intel/ipp/6.0.2.076/em64t/sharedlib/libippcoreem64t.so.6.0 (0x00007f22c2c14000)
[...]
libiomp5.so => not found
libiomp5.so => not found
libiomp5.so => not found

もちろん、ライブラリはそこにあります:

$ locate libiomp5.so
/opt/intel/ipp/6.0.2.076/em64t/sharedlib/libiomp5.so
4

7 に答える 7

5

ライブラリを/path/to/lib含むディレクトリへのパス、または実際のファイルへのパスを意味しますか?

ディレクトリ引数が指定されたオプションは、実際にここで必要なオプションである ld の-Rように扱われます。-rpath指定されたディレクトリをランタイム ライブラリの検索パスに追加します。ファイル名ではなくディレクトリを指定する限り、それは機能するはずです。私は自分でそれをやったので、それについてかなり自信を持っています.libtoolによって与えられたヒントの1つであるからです:

ライブラリは次の場所にインストールされています。

/path/to/library-directory

あるディレクトリ LIBDIR にインストールされたライブラリをリンクしたい場合は、libtool を使用してライブラリのフル パス名を指定するか、リンク中に `-LLIBDIR' フラグを使用して少なくとも次のいずれかを実行する必要があります。続く:

  • 実行中に LIBDIR を LD_LIBRARY_PATH 環境変数に追加します
  • リンク中に LIBDIR を「LD_RUN_PATH」環境変数に追加します
  • `-Wl,-rpath -Wl,LIBDIR' リンカー フラグを使用する
  • システム管理者に LIBDIR を `/etc/ld.so.conf' に追加してもらいます。

(おそらく他のオプションのいずれかがより望ましい可能性があるため、これをここに貼り付けます-たとえば、LD_RUN_PATH は makefile の変更を保存できます)

于 2010-03-20T18:56:26.630 に答える
2

コマンドまたはバイナリでコマンド-Rを実行することにより、ライブラリへのパスがフラグから取得されているかどうかを確認できます。環境変数はオーバーライドであるため、通常は必要ありません。lddreadelfLD_LIBRARY_PATH

于 2010-03-20T19:01:20.737 に答える
2

Richard Pennington が提案したように、不足しているライブラリは私のアプリケーションでは直接使用されませんが、私が使用する共有ライブラリによって使用されます。私は IPP を再コンパイルできないので、私の問題の解決策は-liomp5、リンカーに -R オプションを使用して、コンパイル時に追加することです。これにより、実際に libiomp5.so の rpath が追加され、問題が修正されます!

于 2010-03-22T19:16:54.553 に答える
0

ここに投稿されたすべての有用なヒントに加えて.. 32 ビット システムで 64 ビット固有のライブラリを使用しようとしているわけではありません (または、他の条件に応じてその逆)。

于 2010-03-20T21:01:07.640 に答える
0

可能であれば、-R オプションを使用してください。

そうでない場合は、実行可能ファイルの名前を変更し、実行可能ファイルを実行する起動スクリプトを作成し、そのスコープだけに LD_LIBRARY_PATH を設定します。

プラットフォームによっては、/etc/ld.so.conf.d (Redhat/Fedora が思い浮かびます) を介して ld.so.conf を変更できます。これにより、展開シナリオから ld.so への変更を「より簡単に」展開できます。

于 2010-03-20T20:02:57.537 に答える
-1

バッシュ:

export LD_LIBRARY_PATH=/path/to/lib

tcsh:

setenv LD_LIBRARY_PATH /path/to/lib
于 2010-03-20T18:54:30.303 に答える
-1

デフォルトでディレクトリを検索するようにldconfigスルーを設定してみてください。ld.so.conf/opt/...

于 2010-03-20T19:46:25.377 に答える