Boost 单元测试 link 错误 -- abi 不匹配?
Boost unit test link error -- abi mismatch?
我正在尝试使用 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]
但没有任何改变。
有人知道发生了什么事吗?
将 -D_GLIBCXX_USE_CXX11_ABI=0
添加到您的 CPPFLAGS
,然后重新编译。
gcc 5 附带的 libstdc++ 必须对 std::string
和 std::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。
我正在尝试使用 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]
但没有任何改变。
有人知道发生了什么事吗?
将 -D_GLIBCXX_USE_CXX11_ABI=0
添加到您的 CPPFLAGS
,然后重新编译。
gcc 5 附带的 libstdc++ 必须对 std::string
和 std::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。