c++ - 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>
解决方案
基本上有3个步骤:
- 构建 boost 和相关库及其变体(参见此处的 Boost.Test)
- 使用 CMake 配置项目(此处为示例)
- 构建项目
看起来你已经完成了所有步骤,但让事情变得困难的是这 3 个步骤是相关的,应该以连贯的方式完成:
- 步骤 1+2:如果您在步骤 1 中构建特定的 Boost(或 Boost.Test)变体,则必须使用该变体指示 CMake
- 第 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
,我们将能够更精确地为您提供支持。
推荐阅读
- python - 从另一个模块访问变量
- android - Picasso 加载图像,即使 recyclerView 中的特定位置没有图像 url?
- html - 溢出:隐藏如何影响块元素?
- mysql - 创建表时 MySQL Workbench 语法错误 1064
- neo4j - 使用 neo4j 如何将每个节点的父节点作为数组返回作为结果的一部分
- python - PyQT 中的打字效果如何?
- c++ - 如何在 LLVM 通行证中使用外部库
- html - 更改 CSS SVG 中文本的方向
- python - 如何获取 Case-Shiller 美国全国房价指数的数据?
- android - 如何从 Repository 将参数传递给 Dao 上的查询?