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

use*_*011 4 c++ linker boost unit-testing 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();
Run Code Online (Sandbox Code Playgroud)

但它失败了

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
Run Code Online (Sandbox Code Playgroud)

libboost_unit_test_framework由我的链接器命令发现:

g++-5 --std=c++14 funcopstest.o -L/usr/local/lib -lboost_unit_test_framework -o test_funcops
Run Code Online (Sandbox Code Playgroud)

因为当拿走时-lboost_unit_test_framework,我得到了大量未定义的引用,而不是只有一个.Boost是brew使用c ++ 11模式从源代码安装的.我试图编译,-fabi-version=[0-8]但每次都没有改变.

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

Win*_*ute 8

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

gcc 5附带的libstdc ++必须对C++ 11 进行一些更改std::stringstd::list与之保持一致.为了向后兼容,它支持双ABI,但默认使用新的ABI.

您的libboost_unit_test_framework.so似乎是在不支持新的(可能使用gcc 4.x)的情况下编译的,因此在编译代码时,编译器将生成期望与支持新代码的库链接的代码.在两个ABI不同的情况下,符号将丢失.定义_GLIBCXX_USE_CXX11_ABI0使gcc 5使用旧的库代码.

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