使用 Cmake 编译 boost 测试

问题描述 投票:0回答:3

我试图通过让 cmake 为我编译所有内容来简化一个大型项目,但我在编译 boost 单元测试时遇到了麻烦。我的简单示例的 cmake 文件如下所示。

cmake_minimum_required(VERSION 2.8)
find_package(Boost COMPONENTS system filesystem REQUIRED)
add_excecutable(testTheTester boostTester.cpp)
target_link_libraries(testTheTester ${Boost_FILESYSTEM_LIBRARY} ${Boost_SYSTEM_LIBRARY})
add_test(tester tester)

而boostTester.cpp中的代码是:

#define BOOST_TEST_MAIN
#if !defined( WIN32 )
    #define BOOST_TEST_DYN_LINK
#endif
#include <boost/test/unit_test.hpp>

BOOST_AUTO_TEST_CASE( la ) {
    BOOST_CHECK_EQUAL(1, 1)
}

现在,如果我使用以下命令手动构建它,此 cpp 代码将编译并运行良好:

g++ boostTester.cpp -o output -lboost_unit_test_framework

cmake 工作正常,但是当使用输出 make 文件时,make 崩溃并出现大量错误,其中第一个错误是:

undefined referance to 'boost::unit_test::unit_test_log_t::set_checkpoint(boost... bla bla

现在我最初的想法是 cmake 没有正确链接 boost 库,我尝试了很多命令和组合,但没有成功。有谁知道如何在 cmake 文件中链接 boost_unit_test ?

c++ boost cmake
3个回答
24
投票

您需要将单元测试框架包含在

find_package
命令中的需求列表中,然后链接它:

find_package(Boost COMPONENTS system filesystem unit_test_framework REQUIRED)
...
target_link_libraries(testTheTester
                      ${Boost_FILESYSTEM_LIBRARY}
                      ${Boost_SYSTEM_LIBRARY}
                      ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY}
                      )

4
投票

现在在 CMake 3 中,我建议使用导出的命名空间目标而不是变量。如果您有拼写错误,弗雷泽的答案将无法链接。 另外,如果可以的话,请明确指定链接类型。

find_package(Boost CONFIG COMPONENTS system filesystem unit_test_framework REQUIRED)
...
target_link_libraries(testTheTester
  PRIVATE
  Boost::filesystem
  Boost::system
  Boost::unit_test_framework
  )

0
投票

对于那些使用 CMake 的人

FetchContent

在cmake/Boost.cmake中:

include(FetchContent)

FetchContent_Declare(
    Boost
    GIT_REPOSITORY https://github.com/boostorg/boost.git
    GIT_TAG boost-1.86.0
    GIT_SHALLOW 1
)

set(Boost_USE_STATIC_LIBS ON)
set(Boost_USE_MULTITHREADED ON)
set(Boost_USE_STATIC_RUNTIME OFF)
set(BOOST_ENABLE_CMAKE ON)

set(BOOST_INCLUDE_LIBRARIES
    test
)

FetchContent_MakeAvailable(Boost)

然后在CMakeLists.txt中:

list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")

然后在test/CMakeLists.txt中:

include(Boost)

add_executable(boost_test_toh
    boost_test_terminal_toh.cpp
)
target_link_libraries(boost_test_toh
    PRIVATE precompiled
    PRIVATE Boost::unit_test_framework
    PRIVATE terminal_toh_static
)

添加您需要的任何其他 Boost 库

BOOST_INCLUDE_LIBRARIES
这里是可用选项的列表。

这里是将所有这些付诸实践的 CMakeProjectTemplate。

© www.soinside.com 2019 - 2024. All rights reserved.