我有一个库: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
如何实现不必在库的可执行编译中指定的目标?
最佳答案 我必须承认,我对你想要达到的目标感到有些困惑.使用运行路径搜索路径的整个要点是加载库的图像定义了加载库时要使用的搜索路径.你要求的是库定义可执行文件应该找到它的位置.只需将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
$
该库告诉可执行文件链接它如何通过设置其安装名称来找到它,并且在链接可执行文件以使其在运行时找到库时不需要做任何特殊操作.