我有一个命令行工具,我用Xcode构建,链接到一些Apple框架。
作为一个“个人实验”(只是想了解动态库的工作原理)我尝试将可执行文件指向同一框架的不同版本。
比方说,可执行文件 EXEC 使用 LIB_A ,后者使用 LIB_B 。
我已经复制了 LIB_A 和 LIB_B ,将它们放在不同的(较短的)目录路径下。
我使用otool -L
来获取库的依赖关系和ID。
然后我使用install_name_tool
指令-id
来更改新 LIB_A 和 LIB_B 的ID(基本上只是将前导路径更改为名称)没改变。)
然后使用指令-change
我让新的 LIB_A 指向新的 LIB_B 并让可执行文件 EXEC 指向新的 LIB_A 。
这样,我想,应该已经正确地重新创建了整个依赖树。
install_name_tool
未返回错误并检查可执行文件以及otool
的新库,它们都指向正确的路径。
不幸的是,运行可执行文件 EXEC 会向控制台抛出许多关于类重复定义的错误。就像旧库和新库一样都加载了。
最后一切都因跟踪/ BPT陷阱:5
而崩溃例如:
objc[25992]: Class NSAppleEventManager is implemented in both
/System/Library/Frameworks/Foundation.framework/Versions/C/Foundation and
/xyz/Foundation.
One of the two will be used. Which one is undefined.
如果我调用
export DYLD_PRINT_LIBRARIES=1
我在执行时看到实际上库被加载了两次。
答案 0 :(得分:0)
我实际上是通过粗暴地设置
解决了这个问题export DYLD_LIBRARY_PATH=
这适合我的特殊情况。