1,c++ cmake boost vscode 配置环境编译出bug
报错的CMakeLists.txt
v1.0版CMakeList.txt
# 指定构建该项目所需的最低 CMake 版本为 3.20
# 低于该版本的 CMake 会报错,确保后续指令的兼容性
cmake_minimum_required(VERSION 3.20)
# 定义项目名称为 libpundit,指定项目使用 C++ 语言
# LANGUAGES CXX 明确项目仅依赖 C++,避免默认包含 C 语言
project(libpundit LANGUAGES CXX)
# 包含 GNUInstallDirs 模块,该模块提供标准化的安装目录变量
# 例如 CMAKE_INSTALL_LIBDIR(库安装目录)、CMAKE_INSTALL_INCLUDEDIR(头文件安装目录)等
# 遵循 GNU 标准,提升跨平台兼容性
include(GNUInstallDirs)
# 包含 CMakePackageConfigHelpers 模块,提供生成配置文件的辅助函数
# 用于生成 libpunditConfig.cmake、libpunditConfigVersion.cmake 等文件,方便其他项目通过 find_package 使用本库
include(CMakePackageConfigHelpers)
# 设置项目使用的 C++ 标准为 C++17
set(CMAKE_CXX_STANDARD 17)
# 强制要求编译器支持指定的 C++17 标准,若不支持则报错(而非降级)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# 设定C++标准
# set(CMAKE_CXX_STANDARD 11)
# set(CMAKE_CXX_STANDARD_REQUIRED ON) # 强制要求标准,不向下兼容
# set(CMAKE_CXX_EXTENSIONS OFF) # 禁用编译器扩展(可选,增强跨平台性)
# 定义编译选项:是否构建 libpundit 的测试用例,默认开启(ON)
option(LIBPUNDIT_BUILD_TESTS "Build libpundit tests" ON)
# 定义编译选项:是否构建 pundit 命令行工具(CLI),默认开启(ON)
option(LIBPUNDIT_BUILD_CLI "Build pundit CLI tool" ON)
# 定义编译选项:是否将 libpundit 构建为共享库(动态库),默认关闭(OFF,即默认构建静态库)
option(LIBPUNDIT_BUILD_SHARED "Build libpundit as shared library" OFF)
# 初始化库类型为静态库(STATIC)
set(LIBPUNDIT_LIBRARY_TYPE STATIC)
# 如果开启了 LIBPUNDIT_BUILD_SHARED 选项,则将库类型改为共享库(SHARED)
if (LIBPUNDIT_BUILD_SHARED)
set(LIBPUNDIT_LIBRARY_TYPE SHARED)
endif()
# 针对不同编译器设置编译警告选项,提升代码质量
if (MSVC) # 若使用 Visual Studio 编译器
# /W4:开启最高等级的警告(比默认 /W3 更严格)
# /permissive-:禁用 MSVC 的非标准扩展,强制遵循 C++ 标准
add_compile_options(/W4 /permissive-)
else() # 其他编译器(GCC、Clang 等)
# -Wall:开启基本警告;-Wextra:开启额外警告;-Wpedantic:强制遵循标准,禁用编译器扩展
add_compile_options(-Wall -Wextra -Wpedantic)
endif()
# ======================== Boost 配置关键修正 ========================
# 1. 指定 Boost 源码根目录(仅头文件版,无需编译)
set(BOOST_ROOT "D:/CPLabpickWorkPlace/tools/boost_1_85_0")
# 2. 强制 CMake 只查找头文件,不查找编译后的库文件(关键!解决 "missing: system" 报错)
set(Boost_USE_STATIC_LIBS OFF) # 不使用静态库
set(Boost_USE_SHARED_LIBS OFF) # 不使用共享库
set(Boost_NO_BOOST_CMAKE ON) # 禁用 Boost 自带的 CMake 配置(避免冲突)
set(Boost_NO_SYSTEM_PATHS ON) # 仅从 BOOST_ROOT 查找,不搜索系统路径
# 3. 查找 Boost 头文件(不指定 COMPONENTS,因为 system 是头文件库)
cmake_policy(SET CMP0144 NEW) # 启用新策略,优先识别 BOOST_ROOT 解决警告
cmake_policy(SET CMP0167 OLD) # 保留 FindBoost 兼容 解决警告
find_package(Boost 1.85 REQUIRED)
# 调试用:打印Boost头文件路径,确认CMake找到Boost(可选,可删除)
if(Boost_FOUND)
message(STATUS "✅ Boost头文件路径: ${Boost_INCLUDE_DIRS}")
else()
message(FATAL_ERROR "❌ 未找到Boost,请检查BOOST_ROOT路径是否正确!")
endif()
# ====================================================================
# 创建库目标 libpundit,指定库类型(静态/共享),并列出所有源文件
add_library(libpundit ${LIBPUNDIT_LIBRARY_TYPE}
src/bytes.cpp # 字节操作相关实现
src/crc16_ibm.cpp # CRC16-IBM 校验算法实现
src/framer.cpp # 帧解析/封装相关实现
src/models.cpp # 数据模型相关实现
src/commands.cpp # 命令定义与处理实现
src/responses.cpp # 响应定义与处理实现
src/client.cpp # 客户端核心逻辑实现
src/pundit_session.cpp # 会话管理实现
src/pundit_dispatcher.cpp # 消息分发器实现
src/serial_scan.cpp # 串口扫描相关实现
)
# 若构建共享库,设置库的额外属性
if (LIBPUNDIT_BUILD_SHARED)
set_target_properties(libpundit PROPERTIES
# POSITION_INDEPENDENT_CODE ON:启用位置无关代码(PIC),共享库必需(避免地址重定位问题)
POSITION_INDEPENDENT_CODE ON
# WINDOWS_EXPORT_ALL_SYMBOLS ON:Windows 下自动导出所有符号,无需手动加 __declspec(dllexport)
WINDOWS_EXPORT_ALL_SYMBOLS ON
)
endif()
# 设置 libpundit 的头文件包含目录
target_include_directories(libpundit
PUBLIC # PUBLIC 表示依赖本库的目标也会继承这些包含目录
# BUILD_INTERFACE:构建本库时使用的头文件路径(项目源码中的 include 目录)
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
# INSTALL_INTERFACE:安装后使用的头文件路径(系统标准包含目录)
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
# 添加 Boost 头文件目录(关键!让项目能包含 Boost 头文件)
${Boost_INCLUDE_DIRS}
)
# 为 libpundit 明确指定编译特性:C++17 标准(PUBLIC 传递给依赖目标)
target_compile_features(libpundit PUBLIC cxx_std_17)
# 针对 MSVC 编译器的特殊定义
if (MSVC)
# 解决中文乱码(源码编码为UTF-8时)
add_compile_options("$<$<C_COMPILER_ID:MSVC>:/utf-8>")
add_compile_options("$<$<CXX_COMPILER_ID:MSVC>:/utf-8>")
# 定义 _CRT_SECURE_NO_WARNINGS:禁用 MSVC 对 C 标准库函数(如 sprintf)的安全警告
target_compile_definitions(libpundit PUBLIC _CRT_SECURE_NO_WARNINGS)
endif()
# 针对 Windows 系统的特殊链接
if (WIN32)
# 链接 ws2_32 库:Windows 下网络编程(如 Socket)必需的系统库
target_link_libraries(libpundit PUBLIC ws2_32)
endif()
# 若开启 LIBPUNDIT_BUILD_CLI 选项,构建命令行工具
if (LIBPUNDIT_BUILD_CLI)
# 创建可执行文件目标 pundit_cli,指定源码文件
add_executable(pundit_cli
tools/pundit_cli.cpp
)
# 将 libpundit 库链接到 pundit_cli(PRIVATE 表示仅本目标依赖,不传递)
target_link_libraries(pundit_cli PRIVATE libpundit)
# 给 CLI 目标添加 Boost 头文件目录
target_include_directories(pundit_cli PRIVATE ${Boost_INCLUDE_DIRS})
endif()
# 若开启 LIBPUNDIT_BUILD_TESTS 选项,构建测试用例
if (LIBPUNDIT_BUILD_TESTS)
# 启用 CTest 测试框架,允许使用 add_test 等指令
enable_testing()
# 创建测试可执行文件目标 libpundit_tests,列出测试源码
add_executable(libpundit_tests
tests/test_main.cpp # 测试入口(如 Google Test 的 main)
tests/test_crc.cpp # CRC 算法测试
tests/test_framer.cpp # 帧解析器测试
tests/test_models.cpp # 数据模型测试
tests/test_commands.cpp # 命令处理测试
tests/test_responses.cpp # 响应处理测试
tests/test_dispatcher_smoke.cpp # 分发器冒烟测试
)
# 链接 libpundit 库到测试程序(PRIVATE)
target_link_libraries(libpundit_tests PRIVATE libpundit)
# 给测试目标添加 Boost 头文件目录
target_include_directories(libpundit_tests PRIVATE ${Boost_INCLUDE_DIRS})
# 添加测试用例:名称为 libpundit_tests,执行命令为 libpundit_tests 可执行文件
add_test(NAME libpundit_tests COMMAND libpundit_tests)
endif()
# 安装 libpundit 库目标
install(TARGETS libpundit
# 将库的导出信息写入 libpunditTargets.cmake(供其他项目导入使用)
EXPORT libpunditTargets
# 共享库(LIBRARY)安装到标准库目录(CMAKE_INSTALL_LIBDIR)
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
# 静态库(ARCHIVE)安装到标准库目录
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
# 可执行文件/动态库运行时(RUNTIME)安装到标准二进制目录(Windows 下的 DLL 属于 RUNTIME)
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)
# 安装头文件:将 include 目录下的所有文件/子目录安装到标准包含目录
install(DIRECTORY include/
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
)
# 安装导出的目标文件(libpunditTargets.cmake)
install(EXPORT libpunditTargets
# 导出文件名为 libpunditTargets.cmake
FILE libpunditTargets.cmake
# 命名空间:其他项目通过 libpundit::libpundit 引用本库
NAMESPACE libpundit::
# 安装到库目录下的 cmake/libpundit 子目录(符合 CMake 配置文件规范)
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/libpundit
)
# 生成版本配置文件 libpunditConfigVersion.cmake
write_basic_package_version_file(
# 生成文件的路径(构建目录下)
"${CMAKE_CURRENT_BINARY_DIR}/libpunditConfigVersion.cmake"
# 库的版本号(主版本.次版本.补丁版本)
VERSION 1.0.0
# 兼容性策略:SameMajorVersion 表示主版本相同即可兼容(如 1.x.x 都兼容 1.0.0)
COMPATIBILITY SameMajorVersion
)
# 根据模板文件生成 libpunditConfig.cmake(项目配置文件)
configure_package_config_file(
# 输入模板文件路径(源码目录下的 cmake 子目录)
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/libpunditConfig.cmake.in"
# 输出文件路径(构建目录下)
"${CMAKE_CURRENT_BINARY_DIR}/libpunditConfig.cmake"
# 安装目录:与 Targets 文件同目录
INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/libpundit"
)
# 安装生成的配置文件和版本文件
install(FILES
"${CMAKE_CURRENT_BINARY_DIR}/libpunditConfig.cmake" # 主配置文件
"${CMAKE_CURRENT_BINARY_DIR}/libpunditConfigVersion.cmake" # 版本配置文件
# 安装到 cmake/libpundit 子目录,供 find_package(libpundit) 查找
DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/libpundit"
)
bug解决
配置好环境变量,编译器能找到boost在哪里

boost使用仅头文件模式,不需要编译完成的静态库或者动态库
v2.0版CMakeList.txt
################################################################################
# @file CMakeLists.txt
# @brief libpundit库的CMake构建配置文件
# @details 该配置文件实现了libpundit库的编译、链接、安装逻辑,支持静态/共享库编译、
# CLI工具构建、单元测试编译,以及CMake配置文件的导出(便于第三方工程引入)。
################################################################################
# 设置CMake最低版本要求(3.20及以上)
cmake_minimum_required(VERSION 3.20)
# 声明项目名称及支持的编程语言(仅CXX/C++)
# @param PROJECT_NAME libpundit - 项目核心库名称
# @param LANGUAGES CXX - 仅启用C++编译支持
project(libpundit LANGUAGES CXX)
# 引入GNU安装目录规范模块(定义标准安装路径变量,如CMAKE_INSTALL_LIBDIR等)
include(GNUInstallDirs)
# 引入CMake包配置辅助模块(用于生成版本/配置文件,支持find_package调用)
include(CMakePackageConfigHelpers)
# 设置C++标准为C++17,且强制要求该标准(编译时若不支持则报错)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
################################################################################
# 构建选项配置(通过-D参数可修改,默认值见下文)
################################################################################
# @brief 控制是否编译libpundit的单元测试
# @param LIBPUNDIT_BUILD_TESTS 布尔值,默认ON(编译测试)
option(LIBPUNDIT_BUILD_TESTS "Build libpundit tests" ON)
# @brief 控制是否编译pundit命令行工具(CLI)
# @param LIBPUNDIT_BUILD_CLI 布尔值,默认ON(编译CLI)
option(LIBPUNDIT_BUILD_CLI "Build pundit CLI tool" ON)
# @brief 控制库的编译类型(静态/共享)
# @param LIBPUNDIT_BUILD_SHARED 布尔值,默认OFF(编译静态库)
option(LIBPUNDIT_BUILD_SHARED "Build libpundit as shared library" OFF)
################################################################################
# 库类型选择(静态/共享)
################################################################################
# 默认编译静态库
set(LIBPUNDIT_LIBRARY_TYPE STATIC)
# 若启用共享库编译,则切换为SHARED类型
if (LIBPUNDIT_BUILD_SHARED)
set(LIBPUNDIT_LIBRARY_TYPE SHARED)
endif()
################################################################################
# 编译器警告选项配置
################################################################################
if (MSVC)
# MSVC编译器:启用W4级警告(最高级),禁用非标准C++语法兼容模式
add_compile_options(/W4 /permissive-)
else()
# 非MSVC编译器(GCC/Clang):启用全量警告(Wall/Wextra)+ 严格语法检查(Wpedantic)
add_compile_options(-Wall -Wextra -Wpedantic)
endif()
################################################################################
# 依赖项查找
################################################################################
# 查找Boost库(仅需头文件,无需链接二进制库,因使用header-only模块)
find_package(Boost REQUIRED)
################################################################################
# 核心库构建
################################################################################
# 创建libpundit库目标(静态/共享,由LIBPUNDIT_LIBRARY_TYPE控制)
# 源文件列表包含库的核心实现文件
add_library(libpundit ${LIBPUNDIT_LIBRARY_TYPE}
src/bytes.cpp
src/crc16_ibm.cpp
src/framer.cpp
src/models.cpp
src/commands.cpp
src/responses.cpp
src/client.cpp
src/pundit_session.cpp
src/pundit_dispatcher.cpp
src/device_setup_patch.cpp
src/serial_scan.cpp
)
# 若编译共享库,设置额外属性
if (LIBPUNDIT_BUILD_SHARED)
set_target_properties(libpundit PROPERTIES
POSITION_INDEPENDENT_CODE ON # 启用位置无关代码(PIC),共享库必需
WINDOWS_EXPORT_ALL_SYMBOLS ON # Windows下自动导出所有符号(无需手动__declspec(dllexport))
)
endif()
# 设置库的头文件包含目录(分构建时/安装后两种场景)
# - BUILD_INTERFACE:构建阶段,指向源码中的include目录
# - INSTALL_INTERFACE:安装后,指向系统标准include目录
target_include_directories(libpundit
PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
)
# 声明库支持的C++标准(对外公开cxx_std_17特性)
target_compile_features(libpundit PUBLIC cxx_std_17)
# 定义编译宏(Boost相关,使用header-only版本的System模块)
# - BOOST_ERROR_CODE_HEADER_ONLY:error_code仅用头文件实现
# - BOOST_SYSTEM_NO_LIB:不链接boost_system库(头文件实现)
# @note 需保证所有使用Boost.Asio/error_code的编译单元都定义这些宏
target_compile_definitions(libpundit PUBLIC
BOOST_ERROR_CODE_HEADER_ONLY
BOOST_SYSTEM_NO_LIB
)
# 链接Boost头文件(仅头文件依赖,无二进制库)
target_link_libraries(libpundit PUBLIC Boost::headers)
# MSVC编译器专属宏:禁用"不安全C函数"警告(如sprintf等)
if (MSVC)
target_compile_definitions(libpundit PUBLIC _CRT_SECURE_NO_WARNINGS)
endif()
# Windows系统专属:链接ws2_32库(Windows Socket 2,用于网络/串口相关功能)
if (WIN32)
target_link_libraries(libpundit PUBLIC ws2_32)
endif()
################################################################################
# CLI工具构建(可选)
################################################################################
if (LIBPUNDIT_BUILD_CLI)
# 创建pundit_cli可执行目标,源码为tools/pundit_cli.cpp
add_executable(pundit_cli
tools/pundit_cli.cpp
)
# 链接libpundit库(私有依赖,CLI工具内部使用)
target_link_libraries(pundit_cli PRIVATE libpundit)
endif()
################################################################################
# 单元测试构建(可选)
################################################################################
if (LIBPUNDIT_BUILD_TESTS)
# 启用CTest测试框架
enable_testing()
# 创建测试可执行目标,包含所有测试源码
add_executable(libpundit_tests
tests/test_main.cpp
tests/test_crc.cpp
tests/test_framer.cpp
tests/test_models.cpp
tests/test_commands.cpp
tests/test_responses.cpp
tests/test_dispatcher_smoke.cpp
)
# 链接libpundit库(私有依赖,测试程序内部使用)
target_link_libraries(libpundit_tests PRIVATE libpundit)
# 注册测试用例(名称:libpundit_tests,执行命令:libpundit_tests)
add_test(NAME libpundit_tests COMMAND libpundit_tests)
endif()
################################################################################
# 安装规则(库、头文件、CMake配置文件)
################################################################################
# 安装libpundit库目标
# - EXPORT libpunditTargets:导出目标到libpunditTargets.cmake
# - 不同类型库的安装路径:
# - LIBRARY:共享库 → CMAKE_INSTALL_LIBDIR(如/usr/lib)
# - ARCHIVE:静态库 → CMAKE_INSTALL_LIBDIR
# - RUNTIME:可执行文件/DLL → CMAKE_INSTALL_BINDIR(如/usr/bin)
install(TARGETS libpundit
EXPORT libpunditTargets
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)
# 安装头文件(将include目录下的所有文件复制到系统标准include目录)
install(DIRECTORY include/
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
)
# 安装导出的目标文件(供第三方工程find_package使用)
# - FILE:生成的文件名libpunditTargets.cmake
# - NAMESPACE:目标命名空间libpundit::(使用时需写libpundit::libpundit)
# - DESTINATION:CMake配置文件安装路径(lib/cmake/libpundit)
install(EXPORT libpunditTargets
FILE libpunditTargets.cmake
NAMESPACE libpundit::
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/libpundit
)
# 生成版本配置文件libpunditConfigVersion.cmake
# - VERSION:库版本1.0.0
# - COMPATIBILITY:仅保证主版本兼容(SameMajorVersion)
write_basic_package_version_file(
"${CMAKE_CURRENT_BINARY_DIR}/libpunditConfigVersion.cmake"
VERSION 1.0.0
COMPATIBILITY SameMajorVersion
)
# 从模板生成库配置文件libpunditConfig.cmake
# - 输入模板:cmake/libpunditConfig.cmake.in
# - 输出文件:构建目录下的libpunditConfig.cmake
# - 安装路径:与版本文件同目录
configure_package_config_file(
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/libpunditConfig.cmake.in"
"${CMAKE_CURRENT_BINARY_DIR}/libpunditConfig.cmake"
INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/libpundit"
)
# 安装配置文件和版本文件(供第三方工程find_package(libpundit)调用)
install(FILES
"${CMAKE_CURRENT_BINARY_DIR}/libpunditConfig.cmake"
"${CMAKE_CURRENT_BINARY_DIR}/libpunditConfigVersion.cmake"
DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/libpundit"
)
Boost 配置:v1.0 vs v2.0 核心差异与 v2.0 跑通原因分析
一、核心配置差异对比
表格
| 配置维度 | v1.0 版本(存在兼容性 / 移植性问题) | v2.0 版本(通用且适配 header-only 特性) |
|---|---|---|
| 路径管理 | 硬编码 Windows 绝对路径 BOOST_ROOT "D:/xxx/boost_1_85_0",跨平台性差 |
移除硬编码路径,依赖 CMake 原生 find_package 逻辑(可通过 -DBOOST_ROOT 传参) |
| 库类型强制 | 手动设置 Boost_USE_STATIC_LIBS/OFF Boost_USE_SHARED_LIBS/OFF 等冗余配置 |
移除冗余设置,通过 Boost::headers 明确仅头文件依赖 |
| CMake 策略 | 手动修改 CMP0144/CMP0167 策略,易引发兼容冲突 |
移除自定义策略,依赖 FindBoost 原生适配 |
| 编译宏定义 | 无 Boost 专属宏,导致 header-only 模块(如 system)尝试链接二进制库 | 新增 BOOST_ERROR_CODE_HEADER_ONLY/BOOST_SYSTEM_NO_LIB,适配 header-only 特性 |
| 依赖链接方式 | 仅被动添加 Boost_INCLUDE_DIRS 到包含目录 |
显式链接 Boost::headers(CMake 官方推荐的 header-only 用法) |
| FindBoost 调用 | find_package(Boost 1.85 REQUIRED) + 手动限制系统路径 |
find_package(Boost REQUIRED)(简化,依赖原生查找逻辑) |
二、v2.0 跑通的核心原因
1. 修复 header-only 核心编译宏(最关键)
v1.0 未定义 Boost 专属宏,导致 boost/system/error_code.hpp 等 header-only 模块默认尝试链接 boost_system 二进制库,触发 "missing system" 报错;v2.0 新增以下宏,从编译层面强制适配 header-only 特性:
cmake
target_compile_definitions(libpundit PUBLIC
BOOST_ERROR_CODE_HEADER_ONLY # 强制 error_code 仅用头文件实现,不依赖二进制库
BOOST_SYSTEM_NO_LIB # 禁用自动链接 boost_system 库(header-only 无需链接)
)
2. 采用 CMake 官方推荐的 header-only 依赖方式
v1.0 仅通过 target_include_directories 添加 Boost 头文件路径,是 "被动暴露" 依赖;v2.0 显式链接 Boost::headers(CMake 3.5+ 原生支持的 header-only 目标),既自动引入头文件路径,又明确语义(仅头文件依赖),避免隐式错误:
cmake
find_package(Boost REQUIRED)
target_link_libraries(libpundit PUBLIC Boost::headers) # 官方推荐用法
3. 移除硬编码与冗余配置,提升通用性
- v1.0 硬编码 Windows 绝对路径
BOOST_ROOT,仅适配单一环境,且Boost_NO_SYSTEM_PATHS ON限制了 CMake 跨平台查找能力; - v2.0 移除硬编码和
Boost_USE_STATIC_LIBS/Boost_USE_SHARED_LIBS等冗余设置,让find_package遵循原生逻辑(可通过-DBOOST_ROOT=<路径>灵活指定,兼容 Linux/macOS/Windows)。
4. 简化 CMake 策略,减少兼容冲突
v1.0 手动修改 CMP0144/CMP0167 策略,虽临时解决警告,但易引发新的版本兼容问题;v2.0 移除自定义策略,依赖 FindBoost 模块对 header-only 场景的原生适配,降低冲突风险。
三、header-only Boost 配置最佳实践(参考 v2.0)
cmake
# 1. 查找 Boost(仅头文件,无需指定 COMPONENTS)
find_package(Boost REQUIRED)
# 2. 定义 header-only 适配宏(核心)
target_compile_definitions(libpundit PUBLIC
BOOST_ERROR_CODE_HEADER_ONLY
BOOST_SYSTEM_NO_LIB
)
# 3. 显式链接 Boost::headers(官方推荐)
target_link_libraries(libpundit PUBLIC Boost::headers)
- 无需硬编码
BOOST_ROOT,编译时通过-DBOOST_ROOT=/path/to/boost传参即可; - 无需修改 CMake 策略(除非明确知晓风险);
- 无需手动设置
Boost_USE_STATIC_LIBS/Boost_USE_SHARED_LIBS(对 header-only 无意义)。