提升单元测试链接错误 - abi不匹配?

时间:2015-06-05 14:03:52

标签: 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时,我得到了大量未定义的引用,而不是只有一个。 Boost是使用c ++ 11模式从源代码brew安装的。我试图用-fabi-version=[0-8]编译,但没有改变。

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

1 个答案:

答案 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。