【问题标题】:Mac OS X - Linking executable to different dynamic library, load both old and newMac OS X - 将可执行文件链接到不同的动态库,同时加载旧的和新的
【发布时间】:2014-02-11 08:14:40
【问题描述】:

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

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

假设可执行文件 EXEC 使用 LIB_A 而后者使用 LIB_B

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

我使用otool -L 来获取依赖项和库的ID。

然后我使用 install_name_tool 和指令 -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

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

【问题讨论】:

    标签: objective-c macos dyld otool install-name-tool


    【解决方案1】:

    我居然通过粗暴的设置解决了这个问题

    export DYLD_LIBRARY_PATH=
    

    这适用于我的特殊情况。

    【讨论】:

      猜你喜欢
      • 2020-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-22
      • 1970-01-01
      • 2012-12-14
      • 2023-02-24
      相关资源
      最近更新 更多