C++ 用Cmake编译boost测试

C++ 用Cmake编译boost测试,c++,boost,cmake,C++,Boost,Cmake,我试图通过让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 ${Boo

我试图通过让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)
}
cmake工作正常,但当使用输出make文件时,make崩溃并出现大量错误,其中第一个错误是:

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

现在我最初的想法是cmake没有正确链接boost库,我尝试了许多命令和组合,但都没有成功。有人知道如何在cmake文件中链接boost\u unit\u测试吗?

您需要在
find\u 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}
                      )

干杯,这很有魅力,请注意,您如何找到这些包以及它们的名称以供将来使用?我认为它们通常与
bjam--show libraries
的输出相匹配。Test是lib名称反映bjam目标的约定的例外之一(可能是唯一一个?)。bjam目标只是“test”,而库名称包括“unit_test_framework”。CMake的模块似乎倾向于按照库名称而不是bjam目标名称命名其变量。@Fraser@Ben只需将
unit\u test\u framework
添加到
FIND\u PACKAGE
命令中,然后在
target\u link\u LIBRARIES
命令中使用
${Boost\u LIBRARIES}
。对于名称:它们只是库文件名,没有
boost_
|
libboost_
前缀。@JohannesS。是-如果您确实希望链接
find_包
命令中的所有boost lib,那么这是一个很好的选择。然而,对于所有的目标来说,并不都需要它们是很常见的。例如,单元测试框架库可能不需要链接到主产品库或可执行文件。@Fraser否,根据
FindBoost.cmake
中的代码和文档,
${Boost_LIBRARIES}
仅包含您在
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}
                      )