目录

1.背景

2.boost引入CMake时机

3.CMake 3.30 之前(含 3.29)链接 Boost 的方式

4.CMake 3.30 及之后链接 Boost 的方式

5.CMake3.30后引入Boost的步骤

6.迁移建议(3.30 之前 → 3.30 之后)

7.CMake 3.30 移除FindBoost的原因

8.常见问题

9.总结

相关链接


1.背景

        最近在弄一个开源项目的时候,刚好用到了boost库,用CMake编译的时候报了一下错误:

CMake Warning (dev) at CMakeLists.txt:40 (find_package):                                                                Policy CMP0167 is not set: The FindBoost module is removed.  Run "cmake                                               --help-policy CMP0167" for policy details.  Use the cmake_policy command to                                           set the policy and suppress this warning.                                                                             This warning is for project developers.  Use -Wno-dev to suppress it.

这个警告是由于 CMake 3.25 版本开始弃用了旧的 FindBoost 模块(即 CONFIG 模式未启用时的默认查找方式),并引入了 CMP0167 策略 来提示用户迁移到新的 Boost 查找机制。下面就来讲讲CMake3.30版本之前和之后链接boost的方式的差异。

2.boost引入CMake时机

        Boost 库自 2001 年首次发布以来,经过二十多年的发展,已成为 C++ 生态中最重要的跨库之一,其版本迭代反映了 C++ 语言的演进和开发者对功能的需求变化。

1.早期版本(2001–2005):奠定基础

  • Boost 1.0(2001 年 8 月)
    首次正式发布,包含早期核心库,如 smart_ptr(智能指针)、regex(正则表达式)、tuple(元组)等,确立了 Boost 作为 C++ 标准库补充的定位。

  • Boost 1.30(2003 年 11 月)
    引入 filesystem(文件系统操作)、program_options(命令行参数解析),这两个库后来被广泛应用于各类项目。

  • Boost 1.32(2004 年 8 月)
    加入 thread(多线程库),首次提供跨平台的线程支持,解决了 C++98 标准中缺乏线程库的问题。

2.快速发展期(2006–2010):扩展生态

  • Boost 1.35(2007 年 8 月)
    引入 asio(网络与异步 I/O),成为后续网络编程的核心库(也是 C++11 std::async 的重要参考)。

  • Boost 1.40(2009 年 4 月)
    加入 unordered_map/unordered_set(哈希容器),早于 C++11 标准正式引入同类容器。

  • Boost 1.42(2010 年 2 月)
    新增 locale(国际化与本地化)库,支持多语言编码、日期时间格式化等功能。

3.标准化推动期(2011–2015):对接 C++ 标准

  • Boost 1.47(2011 年 8 月)
    引入 chrono(时间库)和 ratio(比例算术),这两个库随后被纳入 C++11 标准。

  • Boost 1.51(2012 年 6 月)
    加入 filesystem v3 版本,改进了路径处理和跨平台兼容性,成为现代文件操作的标杆。

  • Boost 1.56(2014 年 8 月)
    新增 hana(元编程库),基于 C++11 constexpr 特性,提供更简洁的编译期编程接口。

  • Boost 1.58(2015 年 4 月)
    asio 库支持 C++11 移动语义,性能大幅提升,成为高性能网络库的代表。

4.稳定成熟期(2016–2020):完善与优化

  • Boost 1.60(2016 年 8 月)
    引入 outcome(错误处理库),提供比异常更轻量的错误传递机制,适合高性能场景。

  • Boost 1.64(2017 年 12 月)
    filesystem 库完全支持 C++17 标准的文件系统接口,实现与标准库的兼容。

  • Boost 1.70(2019 年 4 月)
    重大变化:首次提供完整的 CMake 配置文件(BoostConfig.cmake),支持现代 CMake 的目标链接方式(Boost::xxx),为后续 CMake 3.30+ 移除旧模块奠定基础。

  • Boost 1.73(2020 年 8 月)
    优化 coroutine2 库,支持 C++20 协程特性的过渡,提升异步编程体验。

5.近年版本(2021–至今):适配新标准

  • Boost 1.76(2021 年 4 月)
    增强对 C++20 标准的支持,json 库正式稳定,提供高效的 JSON 解析与生成功能。

  • Boost 1.80(2022 年 12 月)

    • 优化 asio 对 TLS 1.3 的支持,网络安全性提升;
    • container 库新增更多 C++20 容器适配器,兼容性更好。
  • Boost 1.83(2023 年 8 月)
    支持 C++23 部分特性,math 库扩展了统计分布函数,适合科学计算场景。

  • Boost 1.85(2024 年 4 月)
    改进跨平台构建系统,进一步完善与 CMake 3.30+ 的兼容性,移除对旧版本编译器的支持。

可见,boost从1.70版本之后提供 CMake 配置文件,支持现代 CMake 目标链接。

3.CMake 3.30 之前(含 3.29)链接 Boost 的方式

此阶段支持两种模式:传统 FindBoost 模块模式(默认)和 Boost 配置文件模式(推荐),可通过策略控制警告。

CMake指令:find_package

1.传统 FindBoost 模块模式(不推荐,逐步废弃)

依赖 CMake 内置的 FindBoost.cmake 模块,通过变量链接库:

cmake_minimum_required(VERSION 3.16)
project(MyProject)# 可选:关闭 CMP0167 警告(3.25+ 版本会提示)
cmake_policy(SET CMP0167 OLD)# 查找 Boost(指定版本和组件)
find_package(Boost 1.80.0 REQUIRED COMPONENTS system filesystem)# 添加可执行文件
add_executable(myapp main.cpp)# 链接 Boost(通过变量)
target_link_directories(myapp PRIVATE ${Boost_LIBRARY_DIRS})
target_link_libraries(myapp PRIVATE ${Boost_LIBRARIES})
target_include_directories(myapp PRIVATE ${Boost_INCLUDE_DIRS})
  • 特点:使用 Boost_LIBRARIESBoost_INCLUDE_DIRS 等变量,依赖 CMake 内置模块解析路径。
  • 缺点:兼容性差,不支持 Boost 最新特性,3.30+ 版本完全失效。

2.Boost 配置文件模式(推荐,向前兼容)

使用 Boost 自带的 BoostConfig.cmake 配置文件,通过目标链接:

cmake_minimum_required(VERSION 3.16)
project(MyProject)# 明确使用 CONFIG 模式(调用 Boost 自带的配置文件)
find_package(Boost 1.80.0 REQUIRED CONFIG COMPONENTS system filesystem)# 添加可执行文件
add_executable(myapp main.cpp)# 链接 Boost(通过命名空间目标)
target_link_libraries(myapp PRIVATE Boost::system Boost::filesystem)
  • 特点:直接链接 Boost::xxx 目标(如 Boost::system),无需手动处理路径。
  • 优势:由 Boost 官方维护配置文件,兼容性更好,支持静态 / 动态库自动切换。

链接目标的优势:  Boost::<component> 是预定义的 CMake 目标,包含以下信息,无需手动配置:

  • 头文件路径(自动添加到 target_include_directories)。
  • 库文件路径(自动添加到 target_link_libraries)。
  • 依赖关系(如 Boost::filesystem 依赖 Boost::system,会自动传递)。
  • 编译选项(如宏定义、链接器标志)。

4.CMake 3.30 及之后链接 Boost 的方式

CMake 3.30 彻底移除了 FindBoost.cmake 模块,强制使用 Boost 配置文件模式,无需再设置 CMP0167 策略。

cmake_minimum_required(VERSION 3.30)
project(MyProject)# 必须使用 CONFIG 模式(默认行为,可省略 CONFIG 关键字)
find_package(Boost 1.80.0 REQUIRED COMPONENTS system filesystem)# 添加可执行文件
add_executable(myapp main.cpp)# 链接 Boost(通过命名空间目标,与 3.30 前的推荐方式一致)
target_link_libraries(myapp PRIVATE Boost::system Boost::filesystem)

变化点

  1. 无需设置 cmake_policy(SET CMP0167 OLD),因为旧模块已移除;
  2. find_package 默认使用 CONFIG 模式,CONFIG 关键字可省略;
  3. 必须确保 Boost 安装时包含 CMake 配置文件(BoostConfig.cmake),否则会报错。

5.CMake3.30后引入Boost的步骤

1.确保 Boost 安装正确

  • 版本要求:Boost 1.70+(含 BoostConfig.cmake),推荐 1.80.0。
  • 安装验证:检查 Boost 安装目录是否存在 lib/cmake/Boost-<version>/BoostConfig.cmake 文件,例如:

2.在 CMakeLists.txt 中引入

# 1. 设置 CMake 最低版本(3.16+ 支持 CONFIG 模式,3.30+ 强制使用)
cmake_minimum_required(VERSION 3.30)
project(MyProject)# 2. (可选)指定 Boost 安装路径(非标准路径时)
# 方式一:通过 BOOST_ROOT 指定根目录
set(BOOST_ROOT "/path/to/boost_1_80_0")# 方式二:通过 CMAKE_PREFIX_PATH 添加搜索路径(支持多个路径)
# set(CMAKE_PREFIX_PATH "${CMAKE_PREFIX_PATH};/path/to/boost_1_80_0")# 3. 查找 Boost(自动加载 BoostConfig.cmake)
# 必须指定所需组件(如 system、filesystem 等)
find_package(Boost 1.80.0 REQUIRED COMPONENTS system      # 示例组件:系统编程filesystem  # 示例组件:文件系统thread      # 示例组件:多线程
)# 4. 添加可执行文件/库
add_executable(myapp main.cpp)# 5. 链接 Boost 目标(核心步骤,无需手动处理路径)
target_link_libraries(myapp PRIVATE Boost::system      # 对应 system 组件Boost::filesystem  # 对应 filesystem 组件Boost::thread      # 对应 thread 组件
)

3.控制静态 / 动态链接

在 find_package 前设置 Boost_USE_STATIC_LIBS 变量:

set(Boost_USE_STATIC_LIBS ON)  # 使用静态库,如果需要动态库则设置为 OFF
set(Boost_USE_MULTITHREADED ON)  # 使用多线程库
set(Boost_USE_STATIC_RUNTIME OFF)  # 如果使用静态运行时库,则设置为 ONfind_package(Boost 1.80.0 REQUIRED COMPONENTS system filesystem)

4.启用调试模式(排查查找问题)

若 find_package 失败,通过以下方式输出详细日志:

# 在 find_package 前设置,输出 Boost 查找过程
set(Boost_DEBUG ON)
find_package(Boost 1.80.0 REQUIRED COMPONENTS system filesystem)

6.迁移建议(3.30 之前 → 3.30 之后)

1.确保 Boost 版本 ≥ 1.70

Boost 从 1.70 版本开始提供完整的 CMake 配置文件,1.80.0 完全兼容。

2.替换变量链接为目标链接

移除 Boost_LIBRARIES 和 Boost_INCLUDE_DIRS,直接使用 Boost::xxx 目标:

# 旧代码
target_link_libraries(myapp PRIVATE ${Boost_LIBRARIES})
target_include_directories(myapp PRIVATE ${Boost_INCLUDE_DIRS})# 新代码
target_link_libraries(myapp PRIVATE Boost::system Boost::filesystem)

3.指定 Boost 安装路径(若需要)

若 Boost 安装在非标准路径,通过 BOOST_ROOT 或 CMAKE_PREFIX_PATH 指定:

set(BOOST_ROOT "/path/to/boost_1_80_0")  # 优先于系统路径
find_package(Boost 1.80.0 REQUIRED COMPONENTS system filesystem)

4.处理静态 / 动态库链接

通过 Boost_USE_STATIC_LIBS 控制链接类型(需在 find_package 前设置):

set(Boost_USE_STATIC_LIBS ON)  # 链接静态库
# set(Boost_USE_STATIC_LIBS OFF)  # 链接动态库(默认)
find_package(Boost 1.80.0 REQUIRED COMPONENTS system filesystem)

7.CMake 3.30 移除FindBoost的原因

尽管 FindBoost 模块广泛使用,但存在以下固有问题:

  1. 依赖 CMake 版本:模块由 CMake 维护,对 Boost 新版本的支持可能滞后(如 Boost 新增组件无法被旧模块识别);
  2. 库名解析复杂:Boost 库命名规则复杂(含编译器、线程模型等后缀),模块容易因命名不匹配导致查找失败;
  3. 跨平台兼容性差:不同平台的库命名和安装路径差异大,模块需大量条件判断适配,易出现边缘 case;
  4. 不支持现代 CMake 特性:无法直接生成 Boost::system 等目标,需手动处理链接路径,不符合现代 CMake 最佳实践。

8.常见问题

1.CMake 3.30+ 找不到 Boost 配置文件

  • 确保 Boost 安装时生成了配置文件(源码编译需启用 --with-cmake 选项,或使用包管理器安装);
  • 通过 BOOST_ROOT 明确指定 Boost 安装目录(包含 lib/cmake/Boost-1.80.0 子目录)。

2.链接错误(如 undefined reference to Boost::xxx

  • 检查 find_package 中是否遗漏了所需组件(如使用 filesystem 需添加 COMPONENTS filesystem);
  • 静态链接时,确保定义了 BOOST_ALL_NO_LIB(部分组件需要)。
target_compile_definitions(myapp PRIVATE BOOST_ALL_NO_LIB)

3. 多版本 Boost 冲突

系统中存在多个 Boost 版本,CMake 找到的不是目标版本。

  • 通过 BOOST_ROOT 精确指定目标版本路径;
  • 结合 NO_DEFAULT_PATH 选项限制搜索范围:
find_package(Boost 1.80.0 REQUIRED COMPONENTS system filesystem NO_DEFAULT_PATH)

9.总结

关键差异:

特性CMake 3.30 之前CMake 3.30 及之后
依赖模块支持 FindBoost.cmake(默认)和配置文件仅支持 Boost 自带配置文件(BoostConfig.cmake
链接方式支持变量(${Boost_LIBRARIES})和目标仅支持目标(Boost::xxx
策略要求需设置 CMP0167 OLD 抑制警告无需设置策略(旧模块已移除)
配置文件依赖可选(可使用旧模块)必须(否则无法找到 Boost)
Boost 版本兼容性支持旧版本 Boost(无配置文件)需 Boost 1.70+(自带 CMake 配置文件)

        CMake 3.30 前后链接 Boost 的核心差异在于是否依赖内置 FindBoost 模块。3.30+ 版本强制使用 Boost 自带的配置文件,通过 Boost::xxx 目标链接,简化了配置并提升了兼容性。迁移时只需替换变量链接为目标链接,并确保 Boost 版本支持 CMake 配置文件即可。

相关链接

  • CMake 官网 CMake - Upgrade Your Software Build System
  • CMake 官方文档:CMake Tutorial — CMake 4.1.0-rc2 Documentation
  • CMake 源码:https://github.com/Kitware/CMake
  • CMake 源码:CMake · GitLab
  • 中文版基础介绍: CMake 入门实战 | HaHack
  • wiki: Home · Wiki · CMake / Community · GitLab
  • Modern CMake 简体中文版: Introduction · Modern CMake

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/90135.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/90135.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/90135.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

告别挂马风险!PBootCMS完美替代方案BadouCMS

开发企业网站时一直比较喜欢用pbootcms,标签套用很简单&#xff0c;使用也方便。 但是pbootcms一直有被挂马的问题&#xff0c;官方好像也不怎么更新了&#xff01;换过好几个cms&#xff0c;比如eyoucms、dedecms、帝国等等&#xff0c;感觉都不怎么能用得习惯&#xff0c;还…

开发者如何集成AI绘画?智创聚合API简化Midjourney接入

在 AI 绘画领域&#xff0c;Midjourney 的大名如雷贯耳&#xff0c;其强大的图像生成能力&#xff0c;能将我们脑海中的奇思妙想&#xff0c;迅速转化为精美的视觉画面&#xff0c;深受设计师、艺术家以及广大创意爱好者的青睐。然而&#xff0c;使用 Midjourney 的过程中&…

pycharm回车、删除、方向键和快捷键等不能使用原因

解决方法 &#xff1a;菜单栏中的Tools取消勾选Vim Emulator 原因 &#xff1a;新版的pycharm安装中&#xff0c;默认安装了vim扩展&#xff0c;一旦安装了pycharm在编写代码时会默认使用Vim编辑器

修复ffmpeg.dll丢失错误|6种解决ffmpeg.dll方法详细教程

看到电脑提示“ffmpeg.dll丢失”&#xff0c;很多人会懵。ffmpeg.dll 是个处理视频、音频的关键文件。它要是没了或坏了&#xff0c;软件就打不开或直接闪退。常见原因是软件安装不全、文件被删、或者中病毒。下面说说它是干嘛的&#xff0c;再给解决办法。一.ffmpeg.dll 到底是…

OkHttp 与 Stetho 结合使用:打造强大的 Android 网络调试工具链

前言在 Android 应用开发过程中&#xff0c;网络请求的调试一直是一个重要但具有挑战性的环节。Facebook 开发的 Stetho 是一个强大的调试工具&#xff0c;当它与 OkHttp 结合使用时&#xff0c;可以为我们提供前所未有的网络请求洞察能力。本文将详细介绍如何将这两者结合使用…

LangGraph教程10:LangGraph ReAct应用

文章目录 ReAct 预构建的代理 向 ReAct 代理添加记忆 向 ReAct 代理添加系统提示 向 ReAct 代理添加人机交互 ReAct 官方文档地址:https://langchain-ai.github.io/langgraph/how-tos/#prebuilt-react-agent 中文文档地址:https://www.aidoczh.com/langgraph/how-tos/#react…

安卓第一个项目

测试所有摄像头 安卓CameraX&#xff1a;https://developer.android.com/media/grow/spatial-audio?hlzh-cn 1、MainActivity.java // 定义包名 package com.mms.densenapplication;// 引入 AppCompatActivity&#xff0c;支持兼容性更强的 Activity import androidx.appcompa…

Google Gemini 体验

文章中代码仓库 gemini 谷歌推出的 AI 只能模型 Gemini官网Gemini ChatGemini开发者文档Gemini SDK 所有模型 模型变体输入输出优化目标Gemini 2.5 Pro gemini-2.5-pro音频、图片、视频、文本和 PDF文本增强的思考和推理能力、多模态理解能力、高级编码能力等Gemini 2.5 Fla…

Trae安装指定版本的插件

前情 Trae是属于国产的跟 Cursor类似的AI编程IDE&#xff0c;我也是第一时间体验Trae的&#xff0c;虽然相比Cursor弱了一些&#xff0c;但是也绝对胜任了&#xff0c;前端因为排队问题我转战了Cursor&#xff0c;等到Trae出收费模式前&#xff0c;我已经办了Cursor会员了&…

【技术追踪】用于医学图像合成和分割的噪声一致孪生扩散模型(CVPR-2025)

孪生扩散模型&#xff0c;生成息肉图像用于提升分割性能&#xff01; 论文&#xff1a;Noise-Consistent Siamese-Diffusion for Medical Image Synthesis and Segmentation 代码&#xff1a;https://github.com/Qiukunpeng/Siamese-Diffusion 0、摘要 深度学习已彻底革新医学影…

Crontab详解

crontab是Unix/Linux系统中用于设置周期性任务的工具&#xff0c;通过编辑配置文件实现定时执行命令或脚本。以下是其语法规则和核心要点&#xff1a; 一、基本格式 * * * * * command - - - - - | | | | | | | | | ----…

中国1km逐月潜在蒸散发数据集 - matlab按shp批量裁剪

中国1km逐月潜在蒸散发数据集 - matlab按shp批量裁剪 1. 数据概述 2 利用掩膜文件对数据进行裁剪 3 完整代码 4 结语 本篇继续处理气象数据,中国1km逐月潜在蒸散发数据集同前节介绍的中国1km降水数据集一样,都可以从国家青藏高原科学数据中心获得,数据具有同样的空间分辨率(…

Node.js链接MySql

前言&#xff1a; 在现代 Web 开发和后端服务中&#xff0c;Node.js 因其高性能和异步特性被广泛使用。MySQL 作为流行的关系型数据库之一&#xff0c;提供了稳定高效的数据存储和管理能力。将 Node.js 与 MySQL 结合&#xff0c;可以构建强大的数据驱动型应用。 一、环境准备…

Charles 的 Windows proxy 对爬取瑞数6 网站接口数据的作用分析

其实本文还是源于上个月的这篇文章 ➡️▼ 耗时两天半&#xff0c;利用 DrissionPage绕过瑞数6&#xff0c;爬取某药*局数据经历~ 不同点是&#xff0c;当时爬取的是列表页&#xff08;已爬完&#xff09;&#xff0c;后面爬取的是详情页&#xff01;懂的都懂&#xff0c;差别还…

PHP 测验

PHP 测验 引言 PHP 作为一种流行的开源服务器端脚本语言,被广泛应用于网页开发、服务器端编程等领域。为了帮助大家更好地理解和掌握 PHP,我们特此推出本 PHP 测验。通过以下问题,您可以检验自己的 PHP 知识水平,同时也能了解自己在哪些方面需要加强。 测验内容 问题一…

阶段1--Linux中的文件服务器(FTP、NAS、SSH)

目录 一、FTP Server 1.1.简介 1.2.FTP基础 1.2.1.控制端口 1.2.2.数据端口 1.3.FTP Server默认配置 1.3.1.安装vsftp 1.3.2.准备分发的文件 1.3.3.启动服务 1.3.4.关闭防火墙 1.4.FTP Client&#xff08;默认仅能下载文件&#xff09; 1.4.1.LinuxFTP客户端程序1&#xff1a;l…

SpringBoot与Vue实战:高效开发秘籍

Spring Boot 是什么? Spring Boot 简介 Spring Boot 是基于 Spring 框架的快速开发工具,旨在简化 Spring 应用的初始搭建和开发过程。它通过约定大于配置的原则,提供自动配置、内嵌服务器和依赖管理等功能,使开发者能够快速构建独立运行的、生产级别的应用。 核心特点 …

基于 fastapi 的 YOLO 批量目标检测 API:支持单图 / 文件夹自适应处理

项目背景 在计算机视觉任务中&#xff0c;我们经常需要对大量图片进行目标检测和标注。YOLO 系列模型凭借其高效性成为目标检测的首选工具之一&#xff0c;但批量处理图片时往往需要编写繁琐的脚本。本文将介绍一个基于 Flask 和 YOLOv11 的 API 服务&#xff0c;支持单张图片…

周志华《机器学习导论》第13章 半监督学习

目录 1. 未标记样本 2. 生成式方法 高斯混合EM 3. 半监督SVM 存在未标记样本的SVM变形 4. 图半监督学习 对图权值迭代矩阵计算 5. 基于分歧的方法 多视图协同训练 6. 半监督聚类 k-means的条件变形 6.1 Constrained k-means 利用“必连”与 “勿连”约束 6.2 Constra…

消息推送功能设计指南:精准触达与用户体验的平衡之道

消息推送功能设计指南&#xff1a;精准触达与用户体验的平衡之道消息推送是平台与用户保持连接的重要桥梁&#xff0c;既能及时传递重要资讯&#xff0c;又能唤醒沉睡用户、提升活跃度。然而&#xff0c;推送功能若设计不当&#xff0c;可能变成 “信息骚扰”&#xff0c;导致用…