2010-12-22 25 views
40

我想在編譯時在Mac OSX下設置可執行文件(用於鏈接器)的運行時路徑,以便在程序啓動時由動態鏈接器找到非標準位置的共享庫。如何在Mac OSX下使用gcc設置可執行文件的運行時路徑(-rpath)?

在Linux下,這可能與-Xlinker -rpath -Xlinker /path/to(或使用-Wl,-rpath,/path/to)並且在Solaris下,您可以將-R/path/to添加到編譯器命令行。

我發現some information是Mac OS X的GCC有自10.5 -rpath支持,即自2008年〜

我試圖把它與一個小例子,工作 - 沒有成功:

$ 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只打印庫名稱(和可能的位置在鏈接時)的可執行文件反對票和運行路徑信息鏈接。

+0

我沒有一個OS X系統,但周圍搜索,[install_name_tool](http://developer.apple.com/ library/mac/#documentation/Darwin/Reference/ManPages/man1/install_name_tool.1.html)可以將rpath添加到您的二進制文件中。不知道你爲什麼不工作 - 「otool -L」說什麼? – ephemient 2010-12-22 22:38:33

回答

32

通過實驗發現,並檢查通過的Xcode用於reference rpath demo project by Dave Driblin生成的命令行:

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` 
+1

是的,這個工程。鑑於在其他類Unix操作系統上已經存在-rpath的語義,偏離實現的Apples似乎有些尷尬。至少他們應該在他們的gcc手冊頁中記錄它。 – maxschlepzig 2010-12-25 11:32:34

相關問題