【问题标题】:How to properly configure boost test with cmake如何使用 cmake 正确配置 boost 测试
【发布时间】:2023-04-06 09:29:01
【问题描述】:

Boost.Test 是一个非常好的单元测试库,但是当我尝试在一个新项目中配置它时总是很痛苦。

如何配置我的项目,它使用 cmake,以使用具有以下要求的 boost(这确实是我在互联网上找到的大多数食谱中我不喜欢的东西的列表):

  • 我不想使用 UTF 的单个标头变体(即我不想包含 boost/test/included/unit_test.hpp)。这样做的理由是它会减慢编译和 IDE 的速度。
  • 我真的不想编写main 函数——除非它是一个单行(我没有找到任何复制粘贴方法来定义主函数)。因此,除非您可以提供这样的 main sn-p,否则这意味着 Boost.Test 是静态链接的。
  • 我不想静态地包含所有内容(通过-static gcc 开关)。我也不想静态编译每个 boost 组件。
  • 我不想在我的 cmake 配置中硬编码任何库路径。

所以这里是test.cpp我想用:

#define BOOST_TEST_MODULE ExampleTest
#include <boost/test/unit_test.hpp>

BOOST_AUTO_TEST_SUITE(ExampleSuite)

BOOST_AUTO_TEST_CASE( my_test )
{
    BOOST_CHECK(true);
}

BOOST_AUTO_TEST_SUITE_END()

这里很简单(不工作!)CMakeLists.txt:

cmake_minimum_required(VERSION 2.8.11)
project(example)
add_executable(simple-test tests.cpp)

【问题讨论】:

    标签: c++ boost cmake boost-test


    【解决方案1】:

    实际上我没有找到任何满足我需要的具体解决方案,但这里有两个部分解决方案,大部分都可以。

    显式静态链接到libboost_unit_test_framework.a:

    在这种情况下,CMakeLists.txt 看起来像这样:

    cmake_minimum_required(VERSION 2.8.11)
    project(example)
    ADD_LIBRARY(boost_unit_test_framework STATIC IMPORTED)
    SET_TARGET_PROPERTIES(boost_unit_test_framework PROPERTIES
        IMPORTED_LOCATION /usr/lib/x86_64-linux-gnu/libboost_unit_test_framework.a)
    add_executable(simple-test tests.cpp)
    target_link_libraries(simple-test boost_unit_test_framework)
    

    缺点是我明确链接到/usr/lib/x86_64-linux-gnu/libboost_unit_test_framework.a,它可以改变(我猜)。

    使用find_packages

    cmake_minimum_required(VERSION 2.8.11)
    set(Boost_USE_STATIC_LIBS ON)
    find_package(Boost COMPONENTS unit_test_framework REQUIRED)
    add_executable(simple-test tests.cpp)
    target_link_libraries(simple-test ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY})
    

    Drawbaks 是(据我了解set(Boost_USE_STATIC_LIBS ON) 强制所有 boost 组件静态链接,这可能是不可取的。

    【讨论】:

      【解决方案2】:

      我用这个:

      cmake_minimum_required(VERSION 2.8.11)
      
      # disable auto link
      add_definitions(-DBOOST_ALL_NO_LIB)
      
      # link against dynamic libraries
      add_definitions(-DBOOST_ALL_DYN_LINK)
      find_package(Boost COMPONENTS system unit_test_framework)
      

      作为加载 boost.test 库之前的序言,它按预期工作。

      【讨论】:

        【解决方案3】:

        您可以在项目中构建自己的 boost UTF 共享版本(静态也可以)。

        add_library(my_boost_test SHARED boost_test.cpp)
        

        有了这个boost_test.cpp

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

        【讨论】:

        • 这是一个解决方案,其实我前段时间用过。但它有一个明显的缺点 --- 它曾经让我的 IDE 窒息。在我添加包含代码后,洞察力大大减慢。
        猜你喜欢
        • 2020-02-05
        • 2012-04-10
        • 2017-10-18
        • 1970-01-01
        • 1970-01-01
        • 2020-09-04
        • 2016-12-23
        • 2019-03-10
        • 1970-01-01
        相关资源
        最近更新 更多