【发布时间】:2020-08-23 10:39:14
【问题描述】:
我正在尝试使用 CMake 和 Boost 库(在本例中为 Boost.Test)设置一个简单的 C++ 项目。除了尝试静态链接之外,我正在遵循本指南:https://www.jetbrains.com/help/clion/boost-test-support.html。我已经使用本指南安装了 Boost:https://www.boost.org/doc/libs/1_73_0/more/getting_started/windows.html,并成功按照步骤 5 生成了库二进制文件。
使用以下 CMake 配置,我在尝试使用 cmake --build . 构建时收到此错误:
test1.obj : error LNK2001: unresolved external symbol "public: virtual void __cdecl boost::unit_test::unit_test_log_t::test_start(unsigned long)" (?test_start@unit_test_log_t@unit_test@boost@@UEAAXK@Z)
tests2.obj : error LNK2001: unresolved external symbol "public: virtual void __cdecl boost::unit_test::unit_test_log_t::test_start(unsigned long)" (?test_start@unit_test_log_t@unit_test@boost@@UEAAXK@Z)
MSVCRTD.lib(exe_main.obj) : error LNK2019: unresolved external symbol main referenced in function "int __cdecl invoke_main(void)" (?invoke_main@@YAHXZ)
CMakeLists.txt
cmake_minimum_required(VERSION 3.13)
project(cmake_boost_test)
set(CMAKE_CXX_STANDARD 14)
add_executable(cmake_boost_test main.cpp)
add_subdirectory(Boost_tests)
Boost_tests/CMakeLists.txt
set(Boost_DEBUG ON)
set(Boost_USE_STATIC_LIBS ON)
find_package(Boost REQUIRED COMPONENTS unit_test_framework)
include_directories(${Boost_INCLUDE_DIRS})
add_executable(Boost_Tests_run test1.cpp tests2.cpp)
target_link_libraries(Boost_Tests_run ${Boost_LIBRARIES})
Boost_tests/test1.cpp
#define BOOST_TEST_MAIN
#include <boost/test/unit_test.hpp>
Boost_tests/tests2.cpp
#include <boost/test/unit_test.hpp>
【问题讨论】:
-
根据 Boost Library naming 方案,
libboost<...>.lib之类的文件表示 static 库,boost<...>.lib之类的文件表示 import 库动态的 (如果被命名为boost<...>.dll)。看来您只安装了静态 Boost 库。对于调试“Could NOT find Boost ...”问题,将-DBoost_DEBUG=ON选项传递给cmake并检查搜索的确切文件名。 -
我有完全相同的问题,哪个根是宏分辨率。链接器报告,它找不到
int main() {}函数。它应该由 Boost.test 定义,但它没有:( 如果你找到了解决方案,那将非常有用 -
@BorikBobrujskov 抱歉,我不知道我是如何解决这个问题的。我相信这与我对下面答案的评论中提到的 Boost_USE_STATIC_LIBS 标志有关。但这是这个问题的工作项目(修复在这里的某个地方):github.com/JSchneidler/cmake_boost_template
标签: c++ visual-c++ boost cmake boost-test