【问题标题】:two static libraries with duplicate symbols in XcodeXcode 中两个带有重复符号的静态库
【发布时间】:2025-11-25 14:30:02
【问题描述】:

我有两个静态库,它们似乎有重复的符号 (TBXML.o),无法编译。

ld: duplicate symbol _OBJC_METACLASS_$_TBXML in /Users/Hoya/Desktop/SocialSync/include/SMUFLib/deviceLib/libSFCommonLibs.a(TBXML.o) and /Users/Hoya/Desktop/SocialSync/Cauly/libCaulyDevice.a(TBXML.o) for architecture armv6
Command /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/clang failed with exit code 1

这两个库的开发者都不提供源代码,所以我无法直接编辑代码来修复它。

我可以做些什么来解决这个问题,而不用唠叨库开发人员?

【问题讨论】:

  • 可能,首先,您知道两者中的 TBXML 是否相同吗?那就是它们提供相同的功能...如果是这样,您可以轻松地重建存档以删除其中一个。
  • 由于我没有源代码,所以我不知道。 :S 有没有我能查到的?

标签: objective-c xcode compilation shared-libraries static-linking


【解决方案1】:

第 1 部分 -- 判断符号是否代表同一个对象。

注意:这是特定于 OS X 的。

好的,让我们看看如何可以查看它们的反汇编。

您可以使用otool 来执行此操作:

otool -v -t '/Users/Hoya/Desktop/SocialSync/Cauly/libCaulyDevice.a(TBXML.o)' 

otool -v -t '/Users/Hoya/Desktop/SocialSync/include/SMUFLib/deviceLib/libSFCommonLibs.a(TBXML.o)'

检查反汇编,看看它们是否相同,如果是,那么你很幸运:-)

如果上述命令的 foo.a(bar.o) 格式不起作用(无论出于何种原因,尽管它应该),您可以通过从两者中删除 (TBXML.o) 来尝试它,但是您将拥有做更多的工作。

如果它们相同,那么您可以轻松地使用 otool + lipo 来重建两个 .a 文件中的一个,以便 TBXML.o 不在其中

如果它们不一样,则必须做更多的诡计:)甚至可能都不容易。

【讨论】:

  • 我已经按照你的建议做了,结果证明它们完全不同。如果他们要修改和编译开源库(在这种情况下为 TBXML)以进行重新分发,我正在尝试使用的两个库的开发人员应该更加体贴。我将接受此答案并向开发人员发送有关此问题的电子邮件。谢谢。
  • @JihoKang 很抱歉,我无法为您提供进一步的帮助……您是对的。如果他们打算使用开源库,那么他们应该提供其库的动态链接版本或单独提供开源库,以便您可以交叉链接。