bug20260415

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 无意义)。
相关推荐
万粉变现经纪人2 小时前
如何解决 pip install flash-attention 报错 需要 SM_80+(Ampere)架构 问题
python·架构·django·bug·virtualenv·pip·pygame
m0_716765232 小时前
数据结构--循环链表、双向链表的插入、删除、查找详解
开发语言·数据结构·c++·学习·链表·青少年编程·visual studio
不想写代码的星星3 小时前
类型萃取:重生之我在幼儿园修炼类型学
开发语言·c++
郝学胜-神的一滴3 小时前
中级OpenGL教程 001:从Main函数到相机操控的完整实现
c++·程序人生·unity·图形渲染·unreal engine·opengl
charlie1145141913 小时前
嵌入式现代C++教程实战篇第12篇:C宏时代的LED驱动 —— 能跑但不优雅
c语言·c++·stm32·单片机·嵌入式硬件·c
wunaiqiezixin3 小时前
链表多项式大整数-BigInt
数据结构·c++·链表
kyle~3 小时前
BFS(广度优先搜索)与 DFS (深度优先搜索)
c++·算法·深度优先·宽度优先
汉克老师3 小时前
GESP2024年3月认证C++三级( 第二部分判断题(1-10))
c++·位运算·string·gesp三级·gesp3级
kyle~4 小时前
FANUC机械臂---PR位置寄存器(Position Register)
c++·机器人·fanuc