相关,但不回答问题:
在 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
.
现在我将一个程序与库链接,例如:
$ 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
或其他此类环境变量。
?