我有一个库:libfoo.dylib。问题在命令中说明:
$ 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 :(得分:2)
我必须承认,我对你想要达到的目标感到有点困惑。使用运行路径搜索路径的整个要点是加载库的图像定义了加载库时要使用的搜索路径。你要求的是库定义可执行文件应该找到它的位置。只需将dylib的安装名称设置为适当的值,即可在不使用runpath搜索路径的情况下完成此操作。根据您的特定示例,您可能希望将安装名称设置为@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
$
该库告诉可执行文件链接它如何通过设置其安装名称来找到它,并且在链接可执行文件以使其在运行时找到库时没有什么特别需要做的。
答案 1 :(得分: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