如何使用cmake正确配置boost测试
How to properly configure boost test with cmake
Boost.Test 是一个非常好的 unit-testing 库,但是当我尝试在新项目中配置它时,它总是很痛苦。
如何配置我使用 cmake 的项目以使用满足以下要求的 boost(这确实是我在互联网上找到的大多数食谱中不喜欢的东西的列表):
- 我不想使用 UTF 的单个 header 变体(即我不想包含
boost/test/included/unit_test.hpp
)。这样做的理由是它会减慢编译速度和 IDE。
- 我真的不想写一个
main
函数——除非它是一个单行函数(我没有找到任何 copy-paste 定义主函数的方法)。因此,除非您可以提供这样的主要代码段,否则这意味着 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)
实际上我没有找到任何满足我需求的具体解决方案,但这里有两个部分解决方案,大部分都可以。
显式 link 静态地 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)
缺点是我明确地 link 到 /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})
这样做的缺点是(据我所知 set(Boost_USE_STATIC_LIBS ON)
强制所有升压组件 link 静态编辑,这可能是不可取的。
您可以在您的项目中构建您自己的共享版本的 boost UTF(静态也可以)。
add_library(my_boost_test SHARED boost_test.cpp)
有了这个boost_test.cpp
:
#include <boost/test/included/unit_test.hpp>
我用这个:
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 库之前的序言,它按预期工作。
Boost.Test 是一个非常好的 unit-testing 库,但是当我尝试在新项目中配置它时,它总是很痛苦。
如何配置我使用 cmake 的项目以使用满足以下要求的 boost(这确实是我在互联网上找到的大多数食谱中不喜欢的东西的列表):
- 我不想使用 UTF 的单个 header 变体(即我不想包含
boost/test/included/unit_test.hpp
)。这样做的理由是它会减慢编译速度和 IDE。 - 我真的不想写一个
main
函数——除非它是一个单行函数(我没有找到任何 copy-paste 定义主函数的方法)。因此,除非您可以提供这样的主要代码段,否则这意味着 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)
实际上我没有找到任何满足我需求的具体解决方案,但这里有两个部分解决方案,大部分都可以。
显式 link 静态地 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)
缺点是我明确地 link 到 /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})
这样做的缺点是(据我所知 set(Boost_USE_STATIC_LIBS ON)
强制所有升压组件 link 静态编辑,这可能是不可取的。
您可以在您的项目中构建您自己的共享版本的 boost UTF(静态也可以)。
add_library(my_boost_test SHARED boost_test.cpp)
有了这个boost_test.cpp
:
#include <boost/test/included/unit_test.hpp>
我用这个:
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 库之前的序言,它按预期工作。