【问题标题】:How to avoid duplicate symbols between 3rd party frameworks如何避免 3rd 方框架之间的重复符号
【发布时间】:2012-08-27 20:02:34
【问题描述】:

我有点进退两难。我在我的项目中添加了 2 个框架,所以碰巧两者都使用 JSONKit。所以当我编译我的项目时,我会在这两个框架之间得到重复的符号。

我必须将 -ObjC -all_load 添加到我的构建设置中,否则由于某些类别未编译,我会遇到运行时错误(崩溃)。

有什么想法吗?

【问题讨论】:

  • 如果您正在获取源代码,只需对其进行编辑,以便您自己包含 JSONKit 并将其从框架源代码中删除。如果您只获得静态库,请写信给维护人员并告诉他们对 JSONKit 进行弱链接,并使其成为使用他们框架的要求(无论如何这是他们应该做的)。
  • 是的,这是个大问题。我见过故意缺少其他必需的第 3 方的库,因为他们知道这会发生冲突。如果您使用的是 -ObjC -all_load 我假设您使用的是实际的 .a 文件。也许您可以要求作者提供没有该库的版本。
  • 是的,我担心这将成为解决方案。我希望避免这组问题更容易。

标签: ios frameworks llvm


【解决方案1】:

当您链接静态库时,链接器会将所有符号嵌入到您的最终二进制文件中。 (这就是它被命名为 static 的原因。)实际上没有什么好的方法可以去掉特定的符号,因为源符号和新嵌入的符号之间没有区别。即使您可以剥离重复的符号,也没有人能确定重复的符号是相同的版本。如果一个库使用了JSONKit库的修改版本,当你用其他版本替换它时它会被破坏。

唯一的方法是获取没有重复符号的.a 文件,或者获取源并自己编译它们。如果库制造者不是白痴,他们应该提供一些没有嵌入符号的库版本。如果没有这样的东西,我强烈建议不要使用那个库。因为它不关心符号冲突,这意味着它是由真正的新手制作的,这意味着它充满了问题。

【讨论】:

    猜你喜欢
    • 2011-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多