Xcode 4中的"bad codegen,pointer diff"链接器错误

Rob*_*gar 13 xcode linker linker-errors ios xcode4

使用Xcode 4重新编译C++ iPhone应用程序我得到了这个讨厌的链接器错误:

ld: bad codegen, pointer diff in __static_initialization_and_destruction_0(int, int)
to global weak symbol vmml::Vector2<float>::ZERO for architecture armv6
Run Code Online (Sandbox Code Playgroud)

谁知道这意味着什么?如何让它消失当然也会很好:)

该应用程序在Xcode 3中无错误地编译和链接.

编辑:解决的办法是设置隐藏的默认符号在项目中的所有目标的所有生成设置.仍然没有更明智的实际问题是什么.

Rob*_*gar 18

解决的办法是设置Symbols Hidden By Default在项目中的所有目标的所有生成设置.仍然没有更明智的实际问题是什么.


Tyl*_*iel 5

我遇到了同样的问题,最后调整了可见性设置.然而,我只是在摆弄符号可见性而不理解问题时感到紧张,所以我做了一些调查.

如果像我一样,你使用Pete Goodliffe的脚本/包来构建boost作为框架,那么脚本会将默认可见性设置为hidden(== yes).可见性选项更改编译器标记符号的方式(默认,隐藏,内部).在创建共享对象elf(共享库)时,链接器使用该信息.它不应该适用于此,所以我怀疑这是一个链接器错误.在boost库中,您有一个标记为隐藏的弱符号,然后在您的项目/另一个库中,标记为默认的相同符号.链接器很困惑?

至于XCode 3与4,可能3中的默认值是隐藏符号?

在任何情况下,将默认可见性更改为隐藏应该只对涉及的静态库实际上没有影响,所以我觉得采用这种方法更安全.

我已经在博客文章中为感兴趣的人发布了更多细节.