首页 > 解决方案 > CMake 项目无法与 Boost.Test 静态或动态链接

问题描述

我正在尝试使用 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>

标签: c++visual-c++boostcmakeboost-test

解决方案


基本上有3个步骤:

  1. 构建 boost 和相关库及其变体(参见此处的 Boost.Test)
  2. 使用 CMake 配置项目(此处为示例)
  3. 构建项目

看起来你已经完成了所有步骤,但让事情变得困难的是这 3 个步骤是相关的,应该以连贯的方式完成:

  1. 步骤 1+2:如果您在步骤 1 中构建特定的 Boost(或 Boost.Test)变体,则必须使用该变体指示 CMake
  2. 第 3 步:当您构建项目时,您的代码程序在某些情况下应该使用定义来构建,该定义指示正在构建的变体是什么。例如,如果您想与 Boost.Test 的共享库版本链接,您必须定义BOOST_TEST_DYN_LINK(在任何包含 Boost.Test 或 with 之前的代码中target_compile_definitions(test_executable PRIVATE "BOOST_TEST_DYN_LINK=1")

在 Boost.Test 的情况下,还有另一个问题:在 Windows 上,自动链接功能将指示链接器自动链接到一个版本的 a .lib:这是我通常通过传递一个 define 来禁用的BOOST_ALL_NO_LIB

如果您能够让 CMake 检测 Boost.Test,那么我一开始就不会为所有这些链接问题而烦恼,而是使用不涉及链接问题的标头变体

回到你目前拥有的东西:

  • 该错误Could NOT find Boost (missing: unit_test_framework) (found version 1.60.0")与第 1+2 步有关:CMake 无法找到具有您所指示的配置的库。有时您需要为 CMake 提供更多变量,以便它找到正确的库,但我猜您只是没有构建共享变体(请参阅此处)。例如我有时使用Boost_COMPILER和。Boost_ARCHITECTURE
  • Boost_USE_STATIC_LIBS仅适用于 CMake:它不会强制您使用正确的定义进行编译。

如果您通过传递 CMake 发布您遇到的错误-DBoost_DEBUG=ON,我们将能够更精确地为您提供支持。


推荐阅读