如何链接 boost unit_test 库(boost_unit_test_framework)?

Pat*_*ryk 5 c++ linker boost 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) {
}
Run Code Online (Sandbox Code Playgroud)

但是通过使用以下命令编译:

g++ main.cpp --std=c++14 -lboost_unit_test_framework
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

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

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

#include <boost/test/included/unit_test_framework.hpp>
Run Code Online (Sandbox Code Playgroud)

但是编译时间要长得多。我在这里缺少什么?我已经尝试了几种使用动态和静态标志的可能性,但都没有奏效。

在线演示失败

编辑

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

g++ main.cpp --std=c++14 -rdynamic /usr/local/lib/libboost_unit_test_framework.so -Wl,-rpath,/usr/local/lib
Run Code Online (Sandbox Code Playgroud)

这成功地构建了我的测试。谁能解释为什么会这样?为什么我需要-rdynamic明确的绝对库路径和-Wl,-rpath,...

use*_*755 0

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

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