2011-05-22 45 views
5

在Mac OS X 10.6下,我构建了一个C++共享库,它链接到boost 1.46。我正在使用与Xcode 4.0一起安装的命令行工具。在32位版本中出现“bad codegen,pointer diff in boost”错误

64位构建工作正常。当构建为32位,我在联收到以下错误信息:

ld: bad codegen, pointer diff in boost::detail::sp_counted_base::sp_counted_base()to global weak symbol vtable for boost::detail::sp_counted_basefor architecture i386 

我发现的唯一的解决方法是使用G ++ - 4.0的32位版本。我试过的其他编译器(g ++ - 4.2,llvm-g ++ - 4.2和clang ++)都会产生上述错误。

回答

1

这个问题似乎在与XCode 4.2一起安装的链接器中得到修复。根据链接我现在得到一个警告,而不是错误消息:

ld: warning: direct access in __ZN5boost6detail15sp_counted_baseC2Ev to global weak symbol __ZTVN5boost6detail15sp_counted_baseE means the weak symbol cannot be overridden at runtime. This was likely caused by different translation units being compiled with different visibility settings. 
+0

你是否设法摆脱这个警告? – 2011-12-13 09:11:04

+0

@StéphanePéchard不,我没有设法摆脱警告。我认为只有在使用完全相同的可见性设置编译库(例如boost)时才能摆脱它。然而,这对于全系统的第三方库来说似乎并不实用。 – sakra 2011-12-13 20:26:18

2

你可能会链接一个使用gcc 4.0编译的库,它与ABI gcc 4.2和clang不兼容。您应该使用与主应用程序相同的编译器选项重建所有与gcc4.2或clang一起使用的库(特别注意“C++标准库类型”,即STANDARD_C_PLUS_PLUS_LIBRARY_TYPE选项,该选项应该一致地设置为“static”或“dynamic”库)。另一个有用的选项是“默认情况下隐藏的符号”,但要注意,如果在用不同选项/编译器编译的库之间传递C++对象,将会使隐藏的错误隐藏起来。

+0

升压与GCC 4.2建成具有动态的libstdc通用二进制++。 除了我使用32位和64位的相同设置的体系结构外。那么这些错误也应该在64位版本中出现呢? – sakra 2011-05-30 18:48:36

+1

我可以猜出两个原因:要么有一个选项使得你的代码不兼容,而64位体系结构不支持这个选项,或者64位ABI没有打破兼容性。从它的外观来看,它不一定会提升本身,这与你的代码冲突,它可能是另一个使用boost的库(并因此编译带有不同选项的boost头):你是否连接了除boost之外的其他二进制库? – pqnet 2011-05-31 08:47:57

+0

Boost有许多不同架构的sp_counted_base类的变体......他们正在做一些特定于CPU的原子操作,所以很可能在一个架构上存在一些问题,而这些问题在另一个架构中不会出现。 FWIW,我们实验室中的某人在尝试修复一些其他可见性错误后得到了同样的错误,我们做了一个干净的客户端代码(Ogre3D),然后就消失了。 *耸耸肩* – Ethan 2011-07-15 18:27:46

5

该问题很可能是因为默认可见性(-fvisibility)将静态链接到两个具有不同值的库。您既可以确保为boost和您的项目使用相同的可见性标志,也可以使用显式的导出符号文件。

2

的信息: 在Xcode中,可见性设置代码生成>联方法隐藏和符号默认

设置那些没有隐藏修复了这个问题。

这在effet中对应于gcc -fvisibility-inlines-hidden和-fvisibility标志。你可以使用这些来调整你的代码的设置,而不是搞乱提升。

+0

即时通讯新的这个,所以请原谅我的无知 - 我到底该怎么做xcode 4.3.2? – 2012-04-19 12:42:21

1

至于说here

如果升压由多个项目在内,每个项目必须具有相同的值

Symbols Hidden by Default 
Inline Methods Hidden 
相关问题