2013-06-19 20 views
4

我有一個庫:libfoo.dylib。問題是在命令所示:如何在dylib中指定rpath?

$ install_name_tool -id "@rpath/libfoo.dylib" libfoo.dylib 
$ install_name_tool -add_rpath "@executable_path/" libfoo.dylib 
$ gcc -o foo foo.c -lfoo 
$ ./foo #<==== I want this to work 
dyld: Library not loaded: @rpath/libfoo.dylib 
    Referenced from: ~/./foo 
    Reason: image not found 
$ install_name_tool -add_rpath "@executable_path/" foo #<=== I dont want to have to specify here where to look for the library 
$ ./foo 
Hello World 

如何實現沒有指定在可執行文件編譯圖書館在的目標是什麼?

+0

我*想*您需要編譯並鏈接'libfoo.dylib'和'-headerpad_max_install_names',以確保有足夠的空間存放您嘗試添加的名稱。一旦'libfoo.dylib'具有其安裝名稱,則無論程序的位置如何,'foo'都能夠鏈接到它。 – jww

回答

0

您唯一需要的是告訴鏈接器在您的二進制文件中添加rpath。其實,你告訴gcc告訴鏈接以下列方式:

$ gcc -o foo foo.c -lfoo -Wl,-rpath=/some/path 

現在,如果你使用objdump看看裏面有什麼了:

$ objdump -x ./foo | less 

您將在Dynamic Section財產以後看到類似RPATH /some/path

如果不必鍵入相同-Wl,-rpath=...太麻煩了,ld接受@file選項(我不知道dyld但我想它確實太):

$ echo "-rpath=/some/path" > ./ld-options 
$ gcc ./foo.c -o foo -Wl,@ld-options 
+1

我想我應該進一步解釋一下,但問題是我有很多可執行文件編譯和只有一個庫。我想讓命令在1行的範圍內生成可執行文件,以便很容易看到警告。爲每個可執行文件編譯命令添加'rpath = ...'使命令非常長,並且超過1行標記。它更多的是方便而非必要。 – chacham15

+0

查看編輯答案 – rectummelancolique

+0

沒有工作,所以我嘗試了原來的方式:'ld:unknown option:-rpath = @ executable_path /' – chacham15

2

我必須承認,我對你想要達成的目標有點困惑。使用運行路徑搜索路徑的全部要點是加載庫的映像定義了加載庫時要使用的搜索路徑。你要求的是爲圖書館定義可執行文件應該在哪裏找到它。只需將dylib的安裝名稱設置爲適當的值,即可在不使用運行路徑搜索路徑的情況下完成此操作。根據你的具體例子,這聽起來像你想要將安裝名稱設置爲@loader_path/libfoo.dylib。考慮下面的,這是沿着你的樣品同樣的思路:

$ cat a.c 
int a(void) 
{ 
    return 1; 
} 
$ cc -install_name "@loader_path/liba.dylib" -dynamiclib -o liba.dylib a.c 
$ cat main.c 
#include <stdio.h> 

extern int a(void); 

int main(int argc, char **argv) 
{ 
    fprintf(stderr, "A: %d\n", a()); 
    return 0; 
} 
$ cc -L. -la -o main main.c 
$ ./main 
A: 1 
$ 

庫告訴針對其鏈接的可執行文件如何通過設置其安裝的名字,並沒有什麼特別需要找到它鏈接可執行文件時做讓它在運行時找到庫。

+0

是的,你的例子做我想做的事情(把庫設置在應該找到的地方,而不是可執行文件)。唯一的問題(以及我想使用rpath的原因)是我想指定3個位置進行搜索:'/ usr/lib','../ Framework /'和可執行路徑。從我的閱讀,不可能使用install_name,對吧? – chacham15

+0

對,如果你想指定多個位置,那麼你需要使用運行路徑搜索路徑,因此可執行文件將指定在哪裏找到庫。請注意,如果在load命令引用的位置找不到該庫,默認情況下將搜索「/ usr/lib」,因此可能不需要顯式引用該位置。 – bdash

相關問題