使用Xcode 4时出现“bad codegen, pointer diff”链接错误

13

使用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中编译和链接应用程序没有错误。

编辑:解决方法是在项目中的所有目标的所有构建设置中将默认情况下隐藏符号设置为Yes。仍然不知道实际问题是什么。


谢谢!对我也解决了——尽管我也不理解! - Ben Robinson
5个回答

18
解决方案是在项目中所有目标的所有构建设置中将 "默认隐藏符号" 设置为 "是"。仍然不知道实际问题是什么。

之前在获取boost库的全局弱符号保护变量时遇到了问题,但是现在已经解决了。非常感谢! - ort11

5
我遇到了同样的问题,也调整了可见性设置。但是,我只是调整了符号可见性,没有理解问题,所以我进行了更多的调查。
如果像我一样,你正在使用Pete Goodliffe的脚本/包来构建boost框架,那么该脚本将默认可见性设置为hidden(== yes)。可见性选项更改编译器标记符号的方式(默认、隐藏、内部)。链接器在制作共享对象elfs(共享库)时使用这些信息。它不应该适用于这里,因此我怀疑这是一个链接器错误。在boost库中,您有一个弱符号标记为hidden,然后在您的项目/另一个库中,相同的符号标记为默认。链接器感到困惑?
至于XCode 3与4之间的区别,也许3中的默认值是隐藏符号?
无论如何,将默认可见性更改为hidden实际上对只涉及静态库的情况没有影响,因此我觉得采取这种方法更加安全。
我在博客文章中发布了更多详细信息,供感兴趣的人参考。

谢谢Tyler,这里有一些很棒的信息! - Stoff81
+1 针对问题进行研究并提供实际描述,而非机械式回答! - Paul Du Bois

4
我在尝试将boost库包含到我的一个项目中时遇到了这个问题。在找到这篇文章后,将Symbols Hidden By Default设置为Yes也解决了这个问题。我还不得不在每个依赖项目中进行相同的设置,才能完全摆脱这个错误。
仅供参考 - 这只发生在使用clang++堆栈的目标上。GCC和LLVM+GCC目标似乎没有受到影响。

使用GCC或LLVM+GCC同样适用于我。将“默认情况下隐藏符号”更改为“是”似乎没有任何变化。 - Andrew

2

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


1

也许你正在使用一个具有隐藏符号信息的库。如果一个符号没有从你的库中导出,并且你试图在外部使用它,那么就会导致类似的链接器错误。正确的解决方案似乎是通过GCC宏定义找到一种方法使该符号对外界“可见”,或修改库本身以确保该特定符号真正地从外界“隐藏”——即它不是在头文件中使用或暴露的。

然而,要小心:根据苹果文档,你不应该隐藏某些符号信息,原因有很多,其中下面列出的原因似乎是最令人担忧的:

如果你的符号使用运行时类型识别(RTTI)信息、异常或动态转换来处理在另一个库中定义的对象发起的请求,那么如果你的符号希望处理由另一个库引发的该类型的异常,你必须确保你的typeinfo对象是可见的。例如,如果你为C++标准库中的一种类型定义了一个catch处理程序,并且你想捕获C++标准库抛出的该类型的异常,那么你必须确保你的typeinfo对象是可见的。

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

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

-fvisibility=hidden --fvisibility-inlines-hidden

(默认可见性应该足够),或者还有编译器pragma允许您这样做。请参阅: http://gcc.gnu.org/wiki/Visibility


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接