【发布时间】:2016-03-03 16:11:11
【问题描述】:
我有一个动态库 libtest.dylib,安装在 /PATH/lib 中,还有一个执行二进制文件 myapp,它使用安装在 /PATH/bin 中的 dylib。
我可以运行myapp来找到dylib,如下(Is it OK to use DYLD_LIBRARY_PATH on Mac OS X? And, what's the dynamic library search algorithm with it?):
DYLD_LIBRARY_PATH="/PATH/lib" myapp
我想我可以使用install_name_tool 来更新库和可执行文件,以便可以使用 rpath 找到该库。我使用了这篇文章中的提示 - How can I specify the rpath in a dylib?。
在 lib 中,我执行了这个命令来添加 rpath。
install_name_tool -id "@rpath/libtest.dylib" libtest.dylib
install_name_tool -add_rpath "@executable_path/../lib/" libtest.dylib
在 bin 中,我执行了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 显示 rpath 在 myapp 中已正确更新。
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
【问题讨论】: