CONFIG模式是find_package推荐方式,依赖库需提供*Config.cmake文件;install(EXPORT)导出目标并手写Config.cmake,配合规范安装路径(如lib/cmake/PackageName/)才能使find_package正常工作。

导出 CONFIG 模块是唯一推荐方式
用 find_package() 正常工作的库,几乎都依赖 CONFIG 模块(即 *Config.cmake 文件),而不是 Find 模块(Find*.cmake)。后者无法感知库的版本变更、编译选项或依赖链,容易导致链接失败或 ABI 不兼容。CONFIG 模块由 CMake 自动生成并随安装过程部署,下游项目才能安全地做 find_package(MyMathLib REQUIRED)。
install(EXPORT) 是导出目标的核心指令
它把当前项目中定义的 targets(比如 add_library(math_lib))打包成一个命名空间化的导入文件(如 MyMathLibTargets.cmake),并记录所有 INTERFACE_* 属性(头文件路径、编译定义、依赖项等)。关键点:
-
install(EXPORT)必须在install(TARGETS)之后执行,否则目标未被安装,下游找不到库文件 - 导出名(如
MyMathLibTargets)要和后续生成的Config.cmake名称对齐 - 必须指定
NAMESPACE MyMathLib::,否则下游无法用MyMathLib::math_lib这种现代写法 - 建议加
EXPORT_LINK_INTERFACE_LIBRARIES(CMake 3.14+ 默认启用),避免依赖传递丢失
手写 *Config.cmake 文件绕不开版本与路径逻辑
仅靠 install(EXPORT) 不够——下游 find_package() 需要一个入口文件(如 MyMathLibConfig.cmake)来定位 targets 文件和头文件。这个文件通常需手写,内容极简但必须严谨:
使用ydata-profiling(前身为pandas-profiling)生成全面的数据质量报告,包含相关性分析、缺失值模式和基数检测。导出交互式HTML仪表板和JSON摘要。
include("${CMAKE_CURRENT_LIST_DIR}/MyMathLibTargets.cmake")
set_and_check(MY_MATH_LIB_INCLUDE_DIRS "${CMAKE_CURRENT_LIST_DIR}/../../../include")
check_required_components(MyMathLib)
注意:
-
set_and_check()确保头文件路径不被用户意外覆盖;路径应相对于Config.cmake自身位置(用${CMAKE_CURRENT_LIST_DIR}),不能写死绝对路径 -
check_required_components()对应find_package(... REQUIRED COMPONENTS xxx)场景,若无组件划分可省略 - 若库有版本要求,需额外提供
MyMathLibConfigVersion.cmake,里面用set(PACKAGE_VERSION ...)和check_version()逻辑
安装路径结构决定 find_package 能否自动找到
CMake 按固定顺序搜索 *Config.cmake:先查 CMAKE_PREFIX_PATH 下的 lib/cmake/MyMathLib/ 或 share/MyMathLib/cmake/,再查系统路径。所以 install() 时必须把 Config 文件放进符合规范的子目录:
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/MyMathLibConfig.cmake DESTINATION lib/cmake/MyMathLib)install(DIRECTORY include/ DESTINATION include)install(TARGETS math_lib EXPORT MyMathLibTargets LIBRARY DESTINATION lib ARCHIVE DESTINATION lib)- 最终安装树应为:
<prefix>/lib/cmake/MyMathLib/MyMathLibConfig.cmake+MyMathLibTargets.cmake
漏掉任一环节,下游执行 find_package(MyMathLib) 就会报 Could not find a package configuration file。

















