-rpath
GCC のリンカー (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] にすることはできますか?