Boost 使用CMake进行增压测试-未定义的主
我在构建一个使用Boost的小程序时遇到问题。请在Mac上使用MacPorts安装的Boost进行测试,安装地址为Boost 使用CMake进行增压测试-未定义的主,boost,cmake,boost-test,Boost,Cmake,Boost Test,我在构建一个使用Boost的小程序时遇到问题。请在Mac上使用MacPorts安装的Boost进行测试,安装地址为/opt/local/lib/ 这是我的最小源文件,test.cpp: #define BOOST_TEST_MODULE MyTest #include <boost/test/unit_test.hpp> BOOST_AUTO_TEST_CASE(test1) { } 和一段摘录自make VERBOSE=1: [100%] Building CXX object
/opt/local/lib/
这是我的最小源文件,test.cpp
:
#define BOOST_TEST_MODULE MyTest
#include <boost/test/unit_test.hpp>
BOOST_AUTO_TEST_CASE(test1) {
}
和一段摘录自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上构建它。我不在乎它是动态链接还是静态链接,我只想让它工作。你需要告诉CMake在哪里可以找到boost库(你的g++行中的
-L/opt/local/lib
)。您可以通过添加以下行来完成此操作(如果您对find\u package
没有问题):
在之前添加可执行文件
另一种选择是使用。此变体非常简单(您只需要包含
,但它的一个主要缺点是构建时间大幅增加。调用查找包(Boost COMPONENTS…
为搜索到的Boost组件收集所需的链接库(例如,单元测试框架
)在CMake变量Boost\u库中
要消除链接错误,请添加:
target_link_libraries(test ${Boost_LIBRARIES})
编辑2020-02
构建Boost.Test模块的详细信息在文档中,文档中有许多示例。通常,如果未找到main
,这可能是由于:
- 混合Boost.Test的静态和共享库版本(链接器更喜欢共享库)
- 和/或宏的定义不正确:根据这些定义,Boost.Test框架将(正确地)定义
main
boost\u unit\u test\u框架
库,而是这个特定库不包含运行二进制文件的main
入口点
事实上,您应该链接到
${Boost\u TEST\u EXEC\u MONITOR\u LIBRARY}
,因为它包含正确的定义。您还应该避免定义宏Boost\u TEST\u DYN\u链接
注意Boost\u TEST\u EXEC\u MONITOR\u LIBRARY
中不存在(至少)cmake版本>3.x的FindBoost.cmake@marco.m我发现要包含一个单独的组件测试执行监视器来修复这个非常古老的答案@sehe
link_directories ( ${Boost_LIBRARY_DIRS} )
target_link_libraries(test ${Boost_LIBRARIES})