Xcode 4的“错误的代码,指针差异”链接器错误

用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 

有人知道这是什么意思? 当然,如何让它消失也是很好的:)

该应用程序在Xcode 3中编译和链接没有错误。

编辑 :解决方法是在项目中的所有目标的所有构build设置中将符号隐藏默认设置为是。 仍然没有什么实际问题是明智的。

解决方法是在项目中的所有目标的所有构build设置中将Symbols Hidden By Default设置为是。 仍然没有什么实际问题是明智的。

我有同样的问题,并最终调整可见性设置。 然而,我很紧张,只是摆弄着象征的知名度,不了解问题,所以我做了一些调查。

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

至于XCode 3与4,也许3中的默认是隐藏符号?

在任何情况下,将默认可见性更改为隐藏,实际上应该只涉及静态库,所以使用这条路线会更安全。

对于那些感兴趣的人,我已经在博客文章中发布了一些更多的细节。

我遇到了这个问题,同时试图包括boost库我的一个项目。 find这篇文章后,将Symbols Hidden By DefaultYes也解决了这个问题。 而且我还必须在每个相关项目中进行相同的设置以彻底摆脱错误。

只是供参考 – 这只发生在我的目标是使用铛++堆栈。 GCC和LLVM + GCC目标似乎不受影响。

基本上,链接到自己代码的库中的任何符号都需要使用相同的可见性级别,即如果所包含库中的所有符号都被隐藏,则需要确保引用项目中符号的包含文件不包含尝试将其设置为可见。 最安全的方法是在整个项目中保持一个恒定的默认可见度,对我来说这只是一个优化问题。

也许你正在使用一个隐藏符号信息的库。 如果一个符号没有从你的库中导出,而你尝试从外部使用它,则会导致类似的链接器错误。 正确的解决scheme似乎是find一种方法,通过GCCmacros定义使外部世界的符号“可见”和/或修改库本身以确保该特定符号真正被外部世界“隐藏” – 它不是在头文件中使用或暴露的东西。

但是请谨慎行事:根据苹果的文档,不应该隐藏一些符号信息,原因有很多, 下面列出的这一个似乎是最令人震惊的一堆:

如果符号使用另一个库中定义的对象的运行时types标识(RTTI)信息,exception或dynamic强制types转换,则该符号必须可见,以便处理由其他库启动的请求。 例如,如果为C ++标准库中的某个types定义catch处理程序,并且想要捕获由C ++标准库引发的该types的exception,则必须确保typeinfo对象可见。

资料来源: http : //developer.apple.com/library/mac/#documentation/DeveloperTools/Conceptual/CppRuntimeEnv/Articles/SymbolVisibility.html

因此,如果你想从你链接的库中捕获exception,隐藏符号信息似乎是一个不好的select。 正确的解决办法是取消隐藏你链接到的任何库的符号。 这可以通过省略以下GCC编译器标志来完成:

-fvisibility=hidden --fvisibility-inlines-hidden

(默认的可见性应该是足够的),或者也有编译器的编译指示,让你做到这一点。 请参阅: http : //gcc.gnu.org/wiki/Visibility