web-dev-qa-db-ja.com

Mac OSXでgccを使用して実行可能ファイルのランタイムパス(-rpath)を設定する方法

コンパイル時に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は、実行可能ファイルがリンクされたライブラリ名(およびリンク時の場所)のみを出力し、ランタイムパス情報は表示しないようです。

43
maxschlepzig

実験によって発見され、Xcodeによって生成されたコマンドラインを調べて Dave Driblinによるrpathデモプロジェクトを参照

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`
36
Ben Karel