当前位置: 首页 > news >正文

【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.lqws.cn/news/543943.html

相关文章:

  • 视觉疲劳检测如何优化智能驾驶的险情管理
  • Java练习题精选16-20
  • C++01背包问题
  • 汇总表支持表头分组,查询组件查询框可以调整高度,DataEase开源BI工具v2.10.11 LTS版本发布
  • ESP32 008 MicroPython Web框架库 Microdot 实现的网络文件服务器
  • A Machine Learning Approach for Non-blind Image Deconvolution论文阅读
  • 金蝶云星空客户端自定义控件插件-WPF实现自定义控件
  • 电磁波是如何传递信息的?
  • 鸿蒙 List 组件解析:从基础列表到高性能界面开发指南
  • 前端 E2E 测试实践:打造稳定 Web 应用的利器!
  • 海外 AI 部署:中国出海企业如何选择稳定、安全的云 GPU 基础设施?
  • 扬州搓澡非遗解码:三把刀文化的“水包皮“
  • 010 【入门】链表入门题目-合并两个有序链表
  • Linux驱动学习day9(异常与中断处理)
  • 华为云Flexus+DeepSeek征文|基于Dify构建故事绘本制作工作流
  • Spark 写入hive表解析
  • Spring Boot项目开发实战销售管理系统——系统设计!
  • 知名流体控制解决方案供应商“永盛科技”与商派ShopeX达成B2B商城项目合作
  • iOS 远程调试与离线排查实战:构建非现场问题复现机制
  • 报道称CoreWeave洽谈收购Core Scientific,后者涨超30%
  • NV025NV033美光固态闪存NV038NV040
  • 《二分枚举答案(配合数据结构)》题集
  • Python Selenium 滚动到特定元素
  • Selenium基本用法
  • Spring Boot 性能优化与最佳实践
  • 6.27_JAVA_面试(被抽到了)
  • 洛谷P5021 [NOIP 2018 提高组] 赛道修建
  • 深入理解 Linux `poll` 模型:`select` 的增强版
  • 记录一次飞书文档转md嵌入vitepress做静态站点
  • 微信小程序进度条progress支持渐变色