【CMake基礎入門教程】第八課:構建并導出可復用的 CMake 庫(支持 find_package() 查找)

很好!我們進入 第八課:構建并導出可復用的 CMake 庫(支持 find_package() 查找)


🎯 本課目標

你將掌握:

  1. 如何構建一個庫并通過 install() 導出其配置;

  2. 如何讓別人在項目中使用 find_package(MyMathLib) 來找到你的庫;

  3. install(EXPORT ...)CMake Package Config 的標準結構;

  4. 自己項目變成像 Qt / Boost / OpenCV 那樣被“可復用”的第三方庫。


一、場景:我們要讓 math_lib 成為“真正的可復用庫”

即別人可以這樣用你:

find_package(MyMathLib REQUIRED)
target_link_libraries(their_app PRIVATE MyMathLib::math_lib)

二、導出 CMake 包需要做的幾步

步驟操作
1?? 安裝目標install(TARGETS ...) 安裝庫
2?? 安裝頭文件install(FILES ...) 安裝接口頭
3?? 導出目標信息install(EXPORT ...)
4?? 安裝 CMake 配置文件MyMathLibConfig.cmake
5?? 生成版本描述文件使用 write_basic_package_version_file()

三、完整示例:導出 math_lib 包

假設項目結構如下:

my_math_lib/
├── CMakeLists.txt
├── math/
│   ├── CMakeLists.txt
│   ├── add.h
│   └── add.cpp
└── cmake/└── MyMathLibConfig.cmake.in

📄 頂層 CMakeLists.txt

cmake_minimum_required(VERSION 3.14)
project(MyMathLib VERSION 1.0 LANGUAGES CXX)# 創建導出組名(可選)
include(GNUInstallDirs)add_subdirectory(math)# 生成版本文件
include(CMakePackageConfigHelpers)
write_basic_package_version_file("${CMAKE_CURRENT_BINARY_DIR}/MyMathLibConfigVersion.cmake"VERSION ${PROJECT_VERSION}COMPATIBILITY SameMajorVersion
)# 安裝配置文件
configure_package_config_file("${CMAKE_CURRENT_SOURCE_DIR}/cmake/MyMathLibConfig.cmake.in""${CMAKE_CURRENT_BINARY_DIR}/MyMathLibConfig.cmake"INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/MyMathLib
)# 安裝配置 + 導出目標
install(FILES"${CMAKE_CURRENT_BINARY_DIR}/MyMathLibConfig.cmake""${CMAKE_CURRENT_BINARY_DIR}/MyMathLibConfigVersion.cmake"DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/MyMathLib
)

📄 math/CMakeLists.txt

add_library(math_lib add.cpp)
target_include_directories(math_lib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})# 設置導出別名(名字空間)
add_library(MyMathLib::math_lib ALIAS math_lib)# 安裝目標
install(TARGETS math_libEXPORT MyMathLibTargetsARCHIVE DESTINATION libLIBRARY DESTINATION libRUNTIME DESTINATION binINCLUDES DESTINATION include
)# 安裝頭文件
install(FILES add.h DESTINATION include)# 導出目標信息(用于 find_package)
install(EXPORT MyMathLibTargetsNAMESPACE MyMathLib::DESTINATION lib/cmake/MyMathLib
)

📄 cmake/MyMathLibConfig.cmake.in

@PACKAGE_INIT@include("${CMAKE_CURRENT_LIST_DIR}/MyMathLibTargets.cmake")

四、構建 + 安裝 + 使用流程

? 構建并安裝:

mkdir build
cd build
cmake .. -DCMAKE_INSTALL_PREFIX=D:/MyMathLib/install
cmake --build . --config Release
cmake --install . --config Release

📁 安裝目錄結構(標準化)

D:/MyMathLib/install/
├── include/
│   └── add.h
├── lib/
│   └── math_lib.lib
├── lib/cmake/MyMathLib/
│   ├── MyMathLibTargets.cmake
│   ├── MyMathLibConfig.cmake
│   └── MyMathLibConfigVersion.cmake

五、別人的項目如何使用你這個庫?

示例 CMakeLists.txt:

cmake_minimum_required(VERSION 3.14)
project(UserProject LANGUAGES CXX)set(CMAKE_PREFIX_PATH "D:/MyMathLib/install")  # 設置查找路徑find_package(MyMathLib REQUIRED)add_executable(app main.cpp)
target_link_libraries(app PRIVATE MyMathLib::math_lib)

? 小結

組件用途
install(EXPORT ...)導出目標給別人用
MyMathLibConfig.cmake.in配置包的入口文件
write_basic_package_version_file()提供版本信息

一旦配置好,你的庫就能被任何支持 find_package() 的項目復用了。


?? 下一課預告:跨平臺支持與條件判斷(if、platform-specific)

你將學會:

  • 如何為 Windows / Linux / macOS 寫不同邏輯

  • 如何處理編譯器差異(如 MSVC / GCC)

  • option() 設置用戶開關(如是否啟用日志、測試)


是否希望我把這個完整導出庫模板也整理進 Canvas?或者你希望我打包為 zip 并生成目錄結構?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/912031.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/912031.shtml
英文地址,請注明出處:http://en.pswp.cn/news/912031.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Jenkins與Kubernetes深度整合實踐

采用的非jenkins-slave方式 jenkins配置: Jenkins添加k8s master節點的服務器信息 在Jenkins容器內部與k8s master節點設置免費登錄 # docker過濾查詢出運行的Jenkins服務 $ docker ps | grep jenkins# 進入Jenkins容器內部 $ docker exec -it jenkins-server /bi…

GraphQL API-1

簡介 判斷GraphQL方式 判斷一個網站是否使用了GraphQL API,可以通過以下幾種方法: 1. 檢查網絡請求 查看請求端點 GraphQL 通常使用單一端點,常見路徑如: /graphql/api/graphql/gql/query 觀察請求特征 POST 請求為主&…

推薦C++題目練習網站

LeetCode LeetCode是一個全球知名的編程練習平臺,提供大量C題目,涵蓋數據結構、算法、系統設計等。題目難度從簡單到困難,適合不同水平的學習者。平臺支持在線編寫代碼并即時運行測試,提供詳細的題目討論區和官方解答。 Codeforc…

Spring Cloud 微服務(服務注冊與發現原理深度解析)

📌 摘要 在微服務架構中,服務注冊與發現是整個系統運行的基礎核心模塊。它決定了服務如何被定位、調用和管理。 本文將深入講解 Spring Cloud 中 Eureka 的服務注冊與發現機制,從底層原理到源碼分析,再到實際開發中的最佳實踐&a…

【Linux 設備模型框架 kobject 和 kset】

Linux 設備模型框架 kobject 和 kset 一、Linux 設備模型概述二、kobject 與 kset 的核心概念1. kobject2. kset3. 關鍵數據結構 三、kobject 與 kset 的實現源碼四、源碼解析與使用說明1. kset 的創建與初始化2. kobject 的創建與屬性3. sysfs 屬性操作4. 用戶空間訪問示例 五…

一起學前端之HTML------(1)HTML 介紹

HTML 介紹 HTML 即超文本標記語言(HyperText Markup Language),它是構成網頁的基礎技術之一。HTML 借助各種標簽(Tag)對網頁的結構與內容加以描述。下面為你介紹其核心要點: 關鍵特性 標簽結構&#xff…

整體遷移法遷移 Docker 鏡像

docker添加了新的鏡像數據盤,數據盤遷移步驟 使用整體遷移法遷移 Docker 鏡像后,可以在確認遷移成功且新數據盤正常使用后,刪除舊數據目錄來釋放空間1。 # 停止 Docker 服務 sudo systemctl stop docker # 停止 socket 監聽器 sudo systemct…

智能IDE+高效數據采集,讓數據獲取接近0門檻

亮數據也有了自己的官方賬號,大家可以關注:https://brightdata.blog.csdn.net/ 現在正有福利,有興趣的伙伴可以訪問鏈接: https://www.bright.cn/products/web-scraper/?utm_sourcebrand&utm_campaignbrnd-mkt_cn_csdn_jhx…

GNSS位移監測站在大壩安全中的用處

一、實時監測大壩變形 整體位移監測 GNSS(全球導航衛星系統)位移監測站能夠實時、連續地獲取大壩在三維空間中的位置信息,包括水平位移和垂直位移。大壩在長期運行過程中,受到水壓力、溫度變化、地基沉降等多種因素的影響&#x…

數字圖像處理(一):從LED冬奧會、奧運會及春晚等等大屏,到手機小屏,快來挖一挖里面都有什么

數字圖像處理(一) 一、什么是圖像:圖像就是多維數組圖像的存儲每一個格子有自己的顏色、深淺如何訪問圖像:1.對于RGB圖像,共有R/G/B三個通道,通過代碼來看。圖像有單通道和多通道之分,訪問時只需…

關于漢語和英語哪個更先進、歷史更久的爭論

引言:熱議背后的思考? ? 在全球化浪潮的推動下,英語作為國際通用語言,在世界范圍內廣泛傳播,其在國際商務、科技交流、學術研究等領域占據著重要地位。而漢語,作為世界上使用人口最多的語言之一,承載著…

在不聯網的情況下,從可以聯網的計算機上拷貝過來的程序報錯:nu1301 無法加載源,https://api.nuget.org/v3/index.json

解決方法: 在聯網的計算機上,找到nuget文件,拷貝到,不能聯網的計算機的相應位置 設置加載這個nuget包,把nuget.org取消。 注意如果出現好多包都不能加載,可能是框架版本的問題,修改框架版本&am…

TCP 狀態流程及原理詳解:從連接建立到性能優化

一、TCP 協議概述與核心價值 TCP(Transmission Control Protocol,傳輸控制協議)是互聯網協議棧中的核心協議之一,為網絡通信提供可靠的、面向連接的數據傳輸服務。在當今復雜多變的網絡環境中,深入理解 TCP 協議的狀態…

【STM32 學習筆記】PWR電源控制

在電子設備中,待機(Standby)和睡眠(Sleep)是兩種不同的省電模式。 1. 待機模式(Standby Mode):在待機模式下,設備仍然保持一定程度的活動,但大部分功能處于暫…

TCP 重傳機制詳解:原理、變體與故障排查應用

一、TCP 重傳機制基礎原理 1.1 可靠傳輸的核心保障 TCP(Transmission Control Protocol,傳輸控制協議)作為互聯網中最常用的傳輸層協議,其核心特性之一是提供可靠的數據傳輸服務。在不可靠的網絡環境中,數據包可能會…

Linux-HTTP服務和APACHE-學習筆記

序 欠10年前自己的一份筆記,獻給今后的自己。 Internet Internet與中國 Internet最早來源于美國國防部高級研究計劃局ARPA建立的ARPANet,1969年投入運行。1983年,ARPAnet分裂為兩部分:ARPAnet和純軍事用的MILNET。當年1月&…

GitHub 趨勢日報 (2025年06月26日)

📊 由 TrendForge 系統生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日報中的項目描述已自動翻譯為中文 📈 今日獲星趨勢圖 今日獲星趨勢圖 716 free-for-dev 677 Self-Hosting-Guide 618 Best-websites-a-programmer-shoul…

利用TACCO將單細胞注釋transfer至空間組

目錄 環境導入 關鍵函數定義 運行前設定 數據準備 正式運行與保存 可視化與概率調整 偶然發現的一個好用的transfer方法,計算效率相當高,解了我的燃眉之急hh 原方法來自由以色列耶路撒冷希伯來大學的Mor Nitzan、美國麻省理工學院-哈佛大學博德研…

在反向代理環境下精準獲取客戶端真實 IP 的最佳實踐

目錄 1 背景 2 常見誤區 3 X-Forwarded-For 解析規則 4 real_ip() 函數 —— 一行代碼落地 5 與框架方法的協同 6 Nginx 端最小配置 7 生產落地 checklist 8 常見 Q&A 9 總結 在反向代理環境下精準獲取客戶端真實 IP 的最佳實踐 — 基于自定義 real_ip() 函數的完…

華為云Flexus+DeepSeek征文|基于Dify構建抓取金融新聞并發送郵箱工作流

華為云FlexusDeepSeek征文|基于Dify構建抓取金融新聞并發送郵箱工作流 一、構建抓取金融新聞并發送郵箱工作流前言二、構建抓取金融新聞并發送郵箱工作流環境2.1 基于FlexusX實例的Dify平臺2.2 基于MaaS的模型API商用服務 三、構建抓取金融新聞并發送郵箱工作流實戰…