相关但不回答问题:
在OSX上,我有一个由包管理器提供并安装在非标准目录中的动态库,其install_name仅为文件名。例如:
$ ROOT=$PWD
$ mkdir $ROOT/foo
$ cd $ROOT/foo
$ echo 'int foo(int a, int b){return a+b;}' > foo.c
$ clang foo.c -dynamiclib -install_name libfoo.dylib -o libfoo.dylib
我不想使用install_name_tool -id
来更改libfoo.dylib的安装名称(绝对路径、@RPATH等)。
现在我将程序与该库链接,例如:
$ mkdir $ROOT/bar
$ cd $ROOT/bar
$ echo 'int foo(int,int); int main(){return foo(2,4);}' > main.c
$ clang main.c -L../foo -lfoo
程序无法运行:
$ ./a.out
dyld: Library not loaded: libfoo.dylib
Referenced from: $ROOT/bar/./a.out
Reason: image not found
Trace/BPT trap: 5
因为:
$ otool -L ./a.out
./a.out:
libfoo.dylib (compatibility version 0.0.0, current version 0.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1)
我可以更改依赖库的路径:
$ install_name_tool -change libfoo.dylib ../foo/libfoo.dylib a.out
所以:
$ otool -L ./a.out
./a.out:
../foo/libfoo.dylib (compatibility version 0.0.0, current version 0.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1)
而且程序可以执行:
$ ./a.out
$ echo $?
6
有没有一个clang选项可以添加到命令中:
$ clang main.c -L../foo -lfoo
避免需要运行:
$ install_name_tool -change libfoo.dylib ../foo/libfoo.dylib a.out
注意:我不想修改DYLD_LIBRARY_PATH
或其他环境变量。
-l<NAME>
标志决定了可执行文件动态链接到的库的名称。因此,如果动态库的文件名为libXYZ.dylib
,那么在编译可执行文件时,你应该将其链接为-lXYZ
。 - Johannes