我有一个名为libtest.dylib的动态库,安装在/PATH/lib
中,还有一个执行二进制文件myapp,使用安装在/PATH/bin
中的dylib。
我可以按照以下方式运行myapp
来查找dylib(在Mac OS X上使用DYLD_LIBRARY_PATH是否可以? 使用它的动态库搜索算法是什么?):
DYLD_LIBRARY_PATH="/PATH/lib" myapp
我认为我可以使用install_name_tool
来更新库和可执行文件,以便可以通过rpath找到库。 我使用了这篇文章中的提示-如何在dylib中指定rpath?。
在库中,我执行了此命令以添加rpath。
install_name_tool -id "@rpath/libtest.dylib" libtest.dylib
install_name_tool -add_rpath "@executable_path/../lib/" libtest.dylib
在终端中,我执行了install_name_tool -add_rpath "@executable_path/../lib/" myapp
命令。
但是,当我在bin
目录下执行myapp
时,出现了错误信息。
dyld: Library not loaded: libtest.dylib
Referenced from: /PATH/bin/./myapp
Reason: image not found
Trace/BPT trap: 5
otool -l myapp
显示 myapp 的 rpath 已经正确更新。
Load command 16
cmd LC_RPATH
cmdsize 40
path @executable_path/../lib/ (offset 12)
对于libtest.dylib也是同样的道理。
Load command 13
cmd LC_RPATH
cmdsize 40
path @executable_path/../lib/ (offset 12)
可能出了什么问题?
附加信息
当然,我可以在编译和链接时使用cc -install_name
,但我想知道如何通过修改生成的dylib和执行二进制文件来实现相同的操作。
来自库:
cc -install_name "@loader_path/../lib/libtest.dylib" -dynamiclib -o libtest.dylib test.c
或者,install_name可以使用@rpath:
cc -install_name "@rpath/libtest.dylib" -dynamiclib -o libtest.dylib test.c
从垃圾箱中:
cc -I../lib -c main.c
cc -o main main.o ../lib/libtest.dylib -Wl,-rpath -Wl,@loader_path/../lib
或者只有一行:
cc -I../lib -L../lib -o main main.c -ltest -Wl,-rpath -Wl,@loader_path/../lib