使用CMake进行Boost测试 - 未定义主要

时间:2012-03-17 00:09:47

标签: boost cmake boost-test

我在构建一个在我的Mac上使用Boost.Test的小程序时遇到了麻烦,我在MacPorts上安装了Boost /opt/local/lib/

这是我的最小源文件test.cpp

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

BOOST_AUTO_TEST_CASE(test1) {
}

和我的CMakeLists.txt

cmake_minimum_required(VERSION 2.6)
project (test)
find_package(Boost COMPONENTS unit_test_framework REQUIRED)
add_executable(test test.cpp)

以及make VERBOSE=1的摘录:

[100%] Building CXX object CMakeFiles/test.dir/test.cpp.o
g++ -o CMakeFiles/test.dir/test.cpp.o -c /Users/exclipy/Code/cpp/inline_variant/question/test.cpp
Linking CXX executable test
"/Applications/CMake 2.8-5.app/Contents/bin/cmake" -E cmake_link_script CMakeFiles/test.dir/link.txt --verbose=1
g++ -Wl,-search_paths_first -Wl,-headerpad_max_install_names CMakeFiles/test.dir/test.cpp.o-o test
Undefined symbols for architecture x86_64:
  "_main", referenced from:
      start in crt1.10.6.o
  "vtable for boost::unit_test::unit_test_log_t", referenced from:
      boost::unit_test::unit_test_log_t::unit_test_log_t() in test.cpp.o
      boost::unit_test::unit_test_log_t::~unit_test_log_t() in test.cpp.o
  NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.

如您所见,它不知道如何链接到Boost库。所以我尝试添加到CMakeLists.txt:

target_link_libraries(test boost_unit_test_framework)

但我得到:

g++ -Wl,-search_paths_first -Wl,-headerpad_max_install_names CMakeFiles/test.dir/test.cpp.o-o test -lboost_unit_test_framework 
ld: library not found for -lboost_unit_test_framework

通过大量的反复试验,我发现手动运行可以解决这个问题:

$ g++ test.cpp -L/opt/local/lib -lboost_unit_test_framework -DBOOST_TEST_DYN_LINK

但经过几个小时的摆弄,我无法从CMake构建它。我不关心它是动态链接还是静态链接,我只是想让它起作用。

3 个答案:

答案 0 :(得分:2)

你需要告诉CMake在哪里找到boost库(g ++行中的-L/opt/local/lib)。您可以通过添加以下行来完成此操作(如果您对find_package没有问题):

link_directories ( ${Boost_LIBRARY_DIRS} )
add_executable之前

另一种选择是使用the single-header variant of the UTF。这个变体非常简单(你只需要包含<boost/test/included/unit_test.hpp>,但它的构建时间大大增加有一个主要缺点。

答案 1 :(得分:2)

find_package(Boost COMPONENTS ...)调用会在CMake变量unit_test_framework中为搜索到的Boost组件(例如,Boost_LIBRARIES)收集所需的链接库。

要摆脱链接错误,请添加:

target_link_libraries(test ${Boost_LIBRARIES})

答案 2 :(得分:0)

那么问题不在于cmake找不到boost_unit_test_framework库,而是这个特定的库不包含运行二进制文件的main入口点。

实际上,您应该链接${Boost_TEST_EXEC_MONITOR_LIBRARY},因为它包含正确的定义。您还应该避免定义宏BOOST_TEST_DYN_LINK