【问题标题】:Boost unit test link error -- abi mismatch?Boost单元测试链接错误——abi不匹配?
【发布时间】:2015-08-20 12:34:24
【问题描述】:

我正在尝试使用 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 是通过 brew 使用 c++11 模式从源代码安装的。我尝试使用每个 -fabi-version=[0-8] 进行编译,但没有任何改变。

有人知道发生了什么吗?

【问题讨论】:

  • 我认为您需要链接到执行监视器 boost_prg_exec_monitor,至少这是我的问题一次。
  • @KlemensMorgenstern 不幸的是,这不起作用。我还尝试了 *-mt 变体。

标签: c++ unit-testing boost linker abi


【解决方案1】:

将-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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-26
    • 2014-08-12
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 2011-01-06
    • 2011-09-10
    • 2014-10-12
    相关资源
    最近更新 更多