c++ - Boost单元测试链接错误--abi不匹配?

标签 c++ unit-testing boost linker abi

我正在尝试使用 boost 构建单元测试,但链接器提示缺少函数。拿这个骨架代码

#define BOOST_TEST_DYN_LINK
#define BOOST_TEST_MAIN
#include <boost/test/unit_test.hpp>

BOOST_AUTO_TEST_SUITE(TestFuncOps);

BOOST_AUTO_TEST_CASE(CopyConstructor)
{
}    

BOOST_AUTO_TEST_SUITE_END();

但是失败了

Undefined symbols for architecture x86_64:
  "boost::unit_test::ut_detail::normalize_test_case_name[abi:cxx11](boost::unit_test::basic_cstring<char const>)", referenced from:
      __GLOBAL__sub_I_funcopstest.cc in funcopstest.o

libboost_unit_test_framework 由我的链接器命令找到:

g++-5 --std=c++14 funcopstest.o -L/usr/local/lib -lboost_unit_test_framework -o test_funcops

因为当去掉 -lboost_unit_test_framework 时,我得到了大量 undefined reference ,而不是只有一个。 Boost 是使用 c++11 模式从源代码通过 brew 安装的。我尝试使用每个 -fabi-version=[0-8] 进行编译,但没有任何改变。

有人知道发生了什么事吗?

最佳答案

-D_GLIBCXX_USE_CXX11_ABI=0 添加到您的 CPPFLAGS,然后重新编译。

gcc 5 附带的 libstdc++ 必须对 std::stringstd::list 进行一些更改以符合 C++11。为了向后兼容,它支持 dual ABI ,但它默认使用新的 ABI。

您的 libboost_unit_test_framework.so 似乎是在不支持新版本的情况下编译的(可能使用 gcc 4.x),因此当您编译代码时,编译器将生成预期链接到支持新版本的库的代码。在两个 ABI 不同的情况下,符号将丢失。将 _GLIBCXX_USE_CXX11_ABI 宏定义为 0 会使 gcc 5 使用旧的库代码。

或者,您可以使用 gcc 5 重建 Boost.Test。

关于c++ - Boost单元测试链接错误--abi不匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30668560/

相关文章:

unit-testing - 使用 System.js 处理 css 导入的 React 组件的 Mocha 测试

ruby-on-rails - CarrierWave 多文件上传 Rails 单元测试

c++ - 使用 Boost 状态图,如何无条件转换到状态?

boost - Clang不编译g++项目

c++ - 我如何迭代集合中的替代元素(或进行特定大小的跳跃)?

c++ - opencv:foundWeights 在 vi​​rtual void detectMultiScale(..) 中意味着什么

c++ - SFML 不适用于 C++

unit-testing - 如何模拟/单元测试嵌套函数

c++ - 移动语义 + 对成员的成员变量的引用 - 解决方案和命名法?

c++ - 将数组存储在单独的类文件中