CMake實踐:CMake3.30版本之前和之后鏈接boost的方式差異

目錄

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;導致用…