&引用;错误的codegen,指针差异“;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 ld:codegen错误,指针在静态初始化和销毁0中存在差异(int,int) 到架构armv6的全局弱符号vmml::Vector2::ZERO

&引用;错误的codegen,指针差异“;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 ld:codegen错误,指针在静态初始化和销毁0中存在差异(int,int) 到架构armv6的全局弱符号vmml::Vector2::ZERO,xcode,ios,linker,linker-errors,xcode4,Xcode,Ios,Linker,Linker Errors,Xcode4,有人知道这是什么意思吗?如何让它消失当然也很好:) 在Xcode 3中编译并链接应用程序时没有错误 编辑:解决方案是在项目中所有目标的所有生成设置中将默认隐藏的符号设置为“是”。但谁也不知道真正的问题是什么 解决方案是在项目中所有目标的所有构建设置中将默认隐藏的符号设置为“是”。但谁也不知道真正的问题是什么 我在尝试将boost库包含到我的一个项目中时遇到了这个问题。找到这篇文章后,将默认隐藏的符号设置为“是”也解决了这个问题。我还必须在每个相关项目中进行相同的设置,以完全消除错误 仅供参考-这

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

在Xcode 3中编译并链接应用程序时没有错误


编辑:解决方案是在项目中所有目标的所有生成设置中将默认隐藏的符号设置为“是”。但谁也不知道真正的问题是什么

解决方案是在项目中所有目标的所有构建设置中将默认隐藏的符号设置为“是”。但谁也不知道真正的问题是什么

我在尝试将boost库包含到我的一个项目中时遇到了这个问题。找到这篇文章后,将默认隐藏的符号设置为“是”也解决了这个问题。我还必须在每个相关项目中进行相同的设置,以完全消除错误


仅供参考-这只发生在我使用clang++堆栈的目标上。GCC和LLVM+GCC目标似乎没有受到影响。

我也遇到了同样的问题,并最终调整了可见性设置。然而,我只是在摆弄符号的可见性而不理解问题,所以我做了更多的调查

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

对于XCode 3和XCode 4,也许3中的默认设置是隐藏符号

在任何情况下,如果只涉及静态lib,那么将默认可见性更改为hidden应该不会有任何效果,所以我觉得这样做更安全


我在a中为感兴趣的人发布了更多详细信息。

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

也许您正在使用一个包含隐藏符号信息的库。如果尚未从库中导出符号,并且您试图在外部使用它,则会导致类似的链接器错误。正确的解决方案似乎是找到一种方法,通过GCC宏定义使该符号对外部世界“可见”,和/或修改库本身,以确保该特定符号对外部世界真正“隐藏”——即它不是在头文件中使用或公开的东西

但是,要小心:根据苹果的文档,你不应该出于一些原因隐藏一些符号信息;下面列出的这一条似乎是其中最令人担忧的一条:

如果符号对另一个库中定义的对象使用运行时类型标识(RTTI)信息、异常或动态强制转换,则如果符号希望处理由另一个库启动的请求,则符号必须可见。例如,如果在C++标准库中定义了一个类型的catch处理程序,并且您想捕获由C++标准库抛出的那种类型的异常,则必须确保您的Type信息对象是可见的。p> 资料来源:

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


-fvisibility=隐藏--fvisibility内联线隐藏


(默认的可见性应该足够),或者也有编译器杂注允许您这样做。请参阅:

谢谢!我也解决了-我也不明白!使用GCC或LLVM+GCC对我也很有用。将默认隐藏的
符号更改为
Yes
似乎并没有改变任何事情。Thx泰勒这里有一些很棒的信息+1感谢你描述了对这个问题的研究,而不是给出狂热的答案!正在变得。。。全局弱符号保护变量。。。这就成功了。非常感谢