0

我有一个用 Xcode 构建的命令行工具,它链接到一些 Apple 框架。

作为“个人实验”(只是想了解一点动态库的工作原理),我试图将可执行文件指向相同框架的不同版本。

例如,假设可执行EXEC使用LIB_A,后者使用LIB_B

我制作了LIB_ALIB_B的副本,将它们放在不同的(较短的)目录路径下。

我曾经otool -L获取依赖项和库的 ID。

然后我使用install_name_toolwith 指令-id更改新LIB_ALIB_B的 ID (基本上只是更改前导路径,因为名称没有更改)。

然后使用指令-change让新的LIB_A指向新的LIB_B并让可执行的EXEC指向新的LIB_A

这样,我认为应该正确地重新创建整个依赖关系树。


install_name_tool没有返回错误并检查可执行文件和新库,otool它们都指向正确的路径。

不幸的是,运行可执行EXEC时,控制台会抛出许多关于类重复定义的错误。就像旧库和新库都被加载一样。

最后一切都因Trace/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

我在执行时看到实际上库被加载了两次。

4

1 回答 1

0

我实际上通过残酷的设置解决了这个问题

export DYLD_LIBRARY_PATH=

这适用于我的特殊情况。

于 2014-02-11T17:30:50.713 回答