【问题标题】:Boost Test with CMake - undefined main使用 CMake 进行 Boost 测试 - 未定义的 main
【发布时间】:2012-03-17 00:09:47
【问题描述】:

我无法在我的 Mac 上构建一个使用 Boost.Test 的小程序,并在 /opt/local/lib//opt/local/lib/ 上安装了 Boost

这是我的最小源文件,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 构建它。我不在乎它是动态链接还是静态链接,我只想让它工作。

【问题讨论】:

    标签: boost cmake boost-test


    【解决方案1】:

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

    link_directories ( ${Boost_LIBRARY_DIRS} )
    

    add_executable之前。

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

    【讨论】:

      【解决方案2】:

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

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

      target_link_libraries(test ${Boost_LIBRARIES})
      

      【讨论】:

        【解决方案3】:

        编辑 2020-02

        构建 Boost.Test 模块的详细信息在文档 here 中,并在文档中包含许多示例。通常如果没有找到main,这可能是由于:

        • 混合使用静态库和共享库版本的 Boost.Test(链接器更喜欢共享库)
        • BOOST_TEST_MODULE 和/或BOOST_TEST_DYN_LINK 宏的不正确定义:根据这些,Boost.Test 框架将定义(正确)main 与否。

        上一个(错误)答案

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

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

        【讨论】:

        • 请注意 Boost_TEST_EXEC_MONITOR_LIBRARY 不存在(至少)cmake 版本 > 3.x 的 FindBoost.cmake。
        • @marco.m 我发现要包含一个单独的 COMPONENT test_exec_monitor 来修复它
        • 更新了这个很老的答案@sehe
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-01-27
        • 2012-04-10
        • 2016-07-24
        • 1970-01-01
        • 2016-09-24
        • 1970-01-01
        • 2014-06-27
        相关资源
        最近更新 更多