c - 如何使用共享静态库避免 xcode 中的 "duplicate symbol"错误?

标签 c objective-c xcode duplicate-symbol

我将静态库 A、B 和 C 组织到 Xcode 项目中。 A 和 B 依赖于 C。当我构建依赖于 A 和 B 的 iPhone 项目时,出现链接器错误,指出在 A 和 B 中检测到重复符号(来自 C)。如何组织这三个静态库,以便我可以将它们包含在其他 Xcode 项目中而不会遇到此错误吗?

最佳答案

Carl 的回答是正确的,但原因不对:将静态库链接在一起实际上并没有错,正如我们使用 Carl 自己的示例所见。设置 Carl 的示例代码,然后执行此操作:(我使用 libtool,因为 XCode 使用它)

neutron:libtest jamie$ libtool -o a2.a a.a c.a
neutron:libtest jamie$ libtool -o b2.a b.a c.a
neutron:libtest jamie$ gcc main.o a2.a b2.a -o app2
neutron:libtest jamie$ ./app2
a
c
b
c
neutron:libtest jamie$ 

这将 a2.a 和 b2.a 与 main.o 链接起来。根据 Carl 的说法,这是 OP 问题的根源,app2 不应该链接。但当然可以。链接器足够聪明,可以忽略同一文件的两个实例。我们可以看到a2.a和b2.a都包含c.o:

neutron:libtest jamie$ ar -t a2.a
__.SYMDEF SORTED
a.o
c.o
neutron:libtest jamie$ ar -t b2.a
__.SYMDEF SORTED
b.o
c.o

但它链接正常。

我认为,问题是链接到通用二进制文件,或者是 PPC/x86 通用二进制文件,或者是 armv6/armv7 iPhone 通用二进制文件。这里的问题是 categories 存在错误并且修复(将 -all_load 添加到链接器标志)是仅适用于单一体系结构的修复。使用 -all_load 会破坏链接器忽略为多个体系结构定义的符号的能力,并且您会遇到重复符号错误。

我写过它here包括比使用 -all_load 更好的解决方案。

关于c - 如何使用共享静态库避免 xcode 中的 "duplicate symbol"错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2300867/

相关文章:

ios - 什么 iOS pod 在 PrivateFrameworks/ScreenReaderCore.framework 中使用 SCRCException?

c - 应用程序内核调试

c - 使用指针代替数组

c - "hello x"- 字符串比较

ios - 在 performBlock 中多次保存上下文

objective-c - 统计 JSON、NSArray

c - 链表 : Initialize Head with function?

objective-c - 将图像写入 cocoa 应用程序中的文件

ios - 使 UIImage 填满整个导航栏

ios - 缺少 148x110 iMessage 图标