gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 03:09:51 27 4
gpt4 key购买 nike

我将静态库 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com