16

関連しますが、質問には答えません:

OSX では、パッケージャー マネージャーによって提供される動的ライブラリが非標準ディレクトリにインストールされています。この install_name は単なるファイル名です。例えば:

$ ROOT=$PWD
$ mkdir $ROOT/foo 
$ cd $ROOT/foo
$ echo 'int foo(int a, int b){return a+b;}' > foo.c
$ clang foo.c -dynamiclib -install_name libfoo.dylib -o libfoo.dylib

を使用して libfoo.dylib の install_name を (絶対パス、@RPATH、...) 変更したくありませんinstall_name_tool -id

次に、プログラムをライブラリにリンクします。たとえば、次のようになります。

$ mkdir $ROOT/bar
$ cd $ROOT/bar
$ echo 'int foo(int,int); int main(){return foo(2,4);}' > main.c
$ clang main.c -L../foo -lfoo   

プログラムを実行できません:

$ ./a.out
dyld: Library not loaded: libfoo.dylib
  Referenced from: $ROOT/bar/./a.out
  Reason: image not found
Trace/BPT trap: 5

なぜなら:

$ otool -L ./a.out
./a.out:
        libfoo.dylib (compatibility version 0.0.0, current version 0.0.0)
        /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1)

依存ライブラリのパスを変更できます。

$ install_name_tool -change libfoo.dylib ../foo/libfoo.dylib a.out

それで:

$ otool -L ./a.out
./a.out:
        ../foo/libfoo.dylib (compatibility version 0.0.0, current version 0.0.0)
        /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1)

プログラムは次を実行できます。

$ ./a.out
$ echo $?
6

コマンドに追加できるclangオプションはありますか:

$ clang main.c -L../foo -lfoo 

実行する必要を避けるために:

$ install_name_tool -change libfoo.dylib ../foo/libfoo.dylib a.out

注:変更したくない、DYLD_LIBRARY_PATHまたはそのような他の環境変数。

?

4

1 に答える 1

20

私はしばらくこれに頭を悩ませてきましたがinstall_name_tool、少なくともMac OS 10.9以降では(私がテストした限り)、 を使用せずにこれを行う方法をついに見つけたと思います。

あなたはすでにこれを理解しているかもしれませんが、他の誰かがそれを必要とする場合に備えて、ここに投稿しています.

基本的に、次の 2 つのオプションがあります。

  1. ライブラリをコンパイルするときにそれを行うことができますinstall_name@executable_path
ROOT=$PWD
mkdir $ROOT/foo
mkdir $ROOT/bar

cd $ROOT/foo
echo 'int foo(int a, int b){return a+b;}' > foo.c
clang foo.c -dynamiclib -install_name @executable_path/../foo/libfoo.dylib -o libfoo.dylib

cd $ROOT/bar
echo 'int foo(int,int); int main(){return foo(2,4);}' > main.c
clang main.c -L../foo -lfoo -o main

./main
echo $?
# output is '6'
  1. または@rpath、実行可能ファイルをコンパイルするときに設定する を使用して 2 つの手順で実行できます。
ROOT=$PWD
mkdir $ROOT/foo
mkdir $ROOT/bar

cd $ROOT/foo
echo 'int foo(int a, int b){return a+b;}' > foo.c
clang foo.c -dynamiclib -install_name @rpath/libfoo.dylib -o libfoo.dylib

cd $ROOT/bar
echo 'int foo(int,int); int main(){return foo(2,4);}' > main.c
clang main.c -L../foo -lfoo -rpath @executable_path/../foo/ -o main

./main
echo $?
# output is '6'

どちらの場合も、最終結果は同じになります。

bar $ otool -L main
main:
  @executable_path/../foo/libfoo.dylib (compatibility version 0.0.0, current version 0.0.0)
  /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1213.0.0)

ライブラリを一度コンパイルし、それを使用する実行可能ファイルに、独自のrpath.

、および(ここでは使用しませんでした)の詳細な説明については、こちらを参照してください。@executable_path@rpath@load_path

于 2015-08-05T06:23:15.053 に答える