如何链接boost unit_test library(boost_unit_test_framework)?

时间:2017-01-06 20:56:10

标签: c++ boost linker boost-test

我有简单的提升单元测试片段:

#define BOOST_TEST_DYN_LINK
#define BOOST_TEST_MAIN
#define BOOST_TEST_MODULE MyTest

#include <boost/test/unit_test.hpp>

int add(int i, int j) {
  return i + j;
}

BOOST_AUTO_TEST_CASE(my_test) {
}

但是使用以下命令进行编译:

g++ main.cpp --std=c++14 -lboost_unit_test_framework

我收到以下错误:

/tmp/ccHOUqfd.o: In function `__static_initialization_and_destruction_0(int, int)':
main.cpp:(.text+0x4ae): undefined reference to `boost::unit_test::ut_detail::auto_test_unit_registrar::auto_test_unit_registrar(boost::unit_test::test_case*, boost::unit_test::decorator::collector&, unsigned long)'
/tmp/ccHOUqfd.o: In function `boost::unit_test::make_test_case(boost::function<void ()> const&, boost::unit_test::basic_cstring<char const>, boost::unit_test::basic_cstring<char const>, unsigned long)':
main.cpp:(.text._ZN5boost9unit_test14make_test_caseERKNS_8functionIFvvEEENS0_13basic_cstringIKcEES8_m[_ZN5boost9unit_test14make_test_caseERKNS_8functionIFvvEEENS0_13basic_cstringIKcEES8_m]+0xa7): undefined reference to `boost::unit_test::test_case::test_case(boost::unit_test::basic_cstring<char const>, boost::unit_test::basic_cstring<char const>, unsigned long, boost::function<void ()> const&)'
collect2: error: ld returned 1 exit status

我尝试使用仅标题版本进行编译并且它可以工作 - 通过将boost单元测试包括更改为:

#include <boost/test/included/unit_test_framework.hpp>

但是编译时间要长一些。我在这里错过了什么?我已经尝试了动态和静态标志的几种可能性,但它们都没有用。

Failing online demo

修改

好的,所以感谢cmake我来到了这个命令:

g++ main.cpp --std=c++14 -rdynamic /usr/local/lib/libboost_unit_test_framework.so -Wl,-rpath,/usr/local/lib

成功构建我的测试。任何人都可以解释为什么会这样吗?为什么我需要-rdynamic,显式绝对库路径和-Wl,-rpath,...

1 个答案:

答案 0 :(得分:0)

好吧,您的boost库显然安装在非标准位置。这就是为什么您需要告诉链接器在哪里可以找到单元测试库所依赖的更多boost库的原因。

有关在Linux和MSVC 2019上构建并运行的完整示例,请参见:https://github.com/jjYBdx4IL/check_zpool