在Mac OS X 10.6下,我正在构建一个链接到boost 1.46的C ++共享库。我正在使用与Xcode 4.0一起安装的命令行工具。
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 ++)都会产生上述错误。
答案 0 :(得分:5)
问题很可能是您将两个具有不同值的库静态链接到默认可见性(-fvisibility)。您可以确保对boost和项目使用相同的可见性标记,也可以使用显式导出符号文件。
答案 1 :(得分:2)
你可能正在链接一个用gcc 4.0构建的库,它与ABI和gcc 4.2以及clang不兼容。您应该使用与主应用程序相同的编译器选项重建与gcc4.2或clang一起使用的所有库(特别注意选项“C ++标准库类型”又名STANDARD_C_PLUS_PLUS_LIBRARY_TYPE,应该在所有库中始终设置为“静态”或“动态”库)。另一个有用的选项是“默认隐藏的符号”,但要注意启用它会隐藏在使用不同选项/编译器编译的库之间传递C ++对象时会出现的令人讨厌的错误。
答案 2 :(得分:2)
有关信息: 在XCode中,在代码生成中设置可见性>内联方法隐藏和默认隐藏的符号
将这些设置为NO可修复此问题。
这在effet中对应于gcc -fvisibility-inlines-hidden和-fvisibility标志。您可以使用它们来调整代码的设置,而不是搞乱提升。
答案 3 :(得分: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.
答案 4 :(得分:1)