【问题标题】:How to include static libraries which have same names for OBJECT files within them?如何在其中包含与 OBJECT 文件具有相同名称的静态库?
【发布时间】:2011-10-19 00:43:34
【问题描述】:

我正在开发一个 iPad 应用程序,其中包含 2 个第三方静态库。这两个库中的目标文件名称相同。在构建应用程序时,我得到了

“Apple Mach -O (id) 错误”

因为这两个库中的目标文件名称相同。 如何解决这个问题?

错误看起来像:

ld: duplicate symbol _T_strcpy in /Users/indiait-supportservices/Desktop/untitled folder/Universal/lib/simulator/libSecurIDLib.a(mem.o) and /Users/indiait-supportservices/Library/Developer/Xcode/DerivedData/ReceiverForiOS-aqpprpcivvjjadbsutqqmtjsoczk/Build/Intermediates/ReceiverForiOS.build/Debug-iphonesimulator/myApp iPad.build/Objects-normal/i386/pdcrypte2.o for architecture i386

collect2: ld returned 1 exit status

Command /Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/llvm-g++-4.2 

failed with exit code 1.

【问题讨论】:

  • 在我看来这是一个重复的符号,而不是一个重复的对象文件名。
  • @Daniel:是的 Daniel,它是一个重复的符号。你能告诉我如何解决这个问题吗?
  • 等待解决方案。请问有人有什么建议吗??
  • 你确定你没有包含两次库吗?

标签: iphone objective-c ipad xcode4


【解决方案1】:

您是在为一种架构而构建吗?如果您正在为多个体系结构构建并使用-all_load 链接器标志,这会破坏链接器忽略为多个体系结构定义的符号的能力。作为测试,尝试只为 armv6 构建,看看错误是否消失。

有一篇很好的博文here 和一个类似的问题讨论了here

最后,您可以添加以下 env var 来调试覆盖类别的问题: OBJC_PRINT_REPLACED_METHODS=YES。这将记录哪些方法名称已被类别覆盖,以防万一。

【讨论】:

    【解决方案2】:

    看起来您有两个定义相同功能的模块,一个位于libSecurIDLib.a(mem.o)pdcrypte2.o。它们应该在它们自己的命名空间中 (C++),或者它们应该加上前缀,这样它们就不会发生冲突 (C)。

    如果不可能的话,有work arounds,但最好安全地命名。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-30
      • 1970-01-01
      • 2014-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-14
      • 2015-09-17
      相关资源
      最近更新 更多