2

-rpathGCC のリンカー (ld) でオプションを使用する方法を学習しようとしています$ORIGIN

私が考えることができる最も単純な例を試しています(以下を参照)。私が読んだすべてのリンクは、私が正しくやっていると言っているようです。

ただし、実行可能ファイルを実行すると、 内から実行しない限り、共有オブジェクトが見つかりません$ORIGIN

実行可能ファイル (main.run) で readelf -d を使用すると、次のように表示されます。


0x0000000000000001 (NEEDED) Shared library: [lib/foo.so]
...
0x000000000000000f (RPATH) Library rpath: [$ORIGIN]
...

ファイル構造(関連ファイル)は次のとおりです。

  • /make/test/dll_test/
    • main.run
    • lib/
      • foo.so

dll_test 内から実行すると正常に動作します。他の場所 (/make/test) から実行すると、次のエラーが発生します。

dll_test/main.run: 共有ライブラリの読み込み中にエラーが発生しました: lib/foo.so: 共有オブジェクト ファイルを開けません: そのようなファイルまたはディレクトリはありません

-l:foo.soの代わりにを使用していますが-lfoo、これは何にも影響しないはずです (願っています)。



ソースファイル

dll_test/src/foo.cpp


int foo()
    { return 1; }

dll_test/src/main.cpp


int foo();

#include <iostream>


int main()
  {
    std::cout << foo() << std::endl;
  }


ビルドスクリプト

dll_test/make.sh


mkdir -p -v obj
mkdir -p -v lib

g++ -c -o obj/foo.o src/foo.cpp -fPIC
g++ -shared -o lib/foo.so obj/foo.o

g++ -c -o obj/main.o src/main.cpp
g++ -o main.run obj/main.o -Wl,-rpath,'$ORIGIN' -Llib -l:foo.so



ビルドするには、これらのファイルをそれぞれの場所に作成し、dll_test 内 (またはプロジェクトのルートがある場所) から "sh make.sh" を実行するだけです。「dll_test/main.run」が生成されます。

dll_test 内から "main.run" を実行すると動作するはずです (出力 1)。
dll_test 内から "main.run" を実行すると失敗します。なんで?

また、foo.so のパスは [lib/foo.so] として main.run に保存されます。-Wl,-rpath,'$ORIGIN/lib' を使用できるように [foo.so] にすることはできますか?

4

1 に答える 1

0

-Wl,-rpath,'$ORIGIN/lib'ただの代わりに必要です'$ORIGIN'

編集:実際に入ってい-l:foo.soますか?それは奇妙に思えます... で問題ないはずです-Wl,-rpath,'$ORIGIN/lib' -Llib -lfoo.so。それでもうまくいかない場合は-Wl,-soname,libfoo.so、共有ライブラリのリンカー コマンドに追加します。これで「lib/foo.so」の問題が修正されるとは確信していませんが、試してみる価値はあります:)

于 2011-06-10T07:47:28.687 に答える