45

非標準の場所にある共有ライブラリがプログラムの開始時に動的リンカーによって検出されるように、コンパイル時に実行可能ファイル (リンカー用) のランタイム パスを Mac OSX で設定したいと考えています。

Linux ではこれを-Xlinker -rpath -Xlinker /path/to(または を使用して-Wl,-rpath,/path/to) 行うことができ、Solaris-R/path/toではコンパイラ コマンド ラインに追加できます。

Mac OS X gcc が 10.5 以降、つまり 2008 年以降 -rpath をサポートしているという情報を見つけました。

最小限の例で動作させようとしましたが、成功しませんでした:

$ cat blah.c 
int blah(int b)
{
  return b+1;
}

と:

$ cat main.c 

#include <stdio.h>

int blah(int);

int main ()
{
  printf("%d\n", blah(22));
  return 0;
}

次のようにコンパイルしました。

$ gcc -c  blah.c
$ gcc -dynamiclib blah.o -o libblah.dylib
$ gcc main.c -lblah -L`pwd`  -Xlinker -rpath -Xlinker `pwd`/t

今テスト:

$ mkdir t
$ mv libblah.dylib t
$ ./a.out
dyld: Library not loaded: libblah.dylib
  Referenced from: /Users/max/test/./a.out
  Reason: image not found
Trace/BPT trap

したがって、質問: Mac OSX でリンカーのランタイム パスを設定するにはどうすればよいですか?

ところで、設定DYLD_LIBRARY_PATHは機能しますが、このハックを使用したくありません。

編集:についてotool -L

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

otool -L実行可能ファイルがリンクされたライブラリ名(およびおそらくリンク時の場所)のみを出力し、ランタイムパス情報は出力しないようです。

4

1 に答える 1

42

Dave Driblin によるリファレンス rpath デモ プロジェクトの Xcode によって生成されたコマンド ラインを調査し、実験によって発見されました。

otool -Lリンクされたライブラリのインストール名が表示されます。作業を@rpath開始するには、ライブラリのインストール名を変更する必要があります。

$ gcc -dynamiclib blah.o -install_name @rpath/t/libblah.dylib -o libblah.dylib
$ mkdir t ; mv libblah.dylib t/
$ gcc main.c -lblah -L`pwd`/t -Xlinker -rpath -Xlinker `pwd`
于 2010-12-23T00:02:19.443 に答える