根本原因是cmake只在系统路径和cmake_prefix_path指定的前缀路径下按约定子目录搜索xxxconfig.cmake,不会递归扫描任意目录;应设置cmake_prefix_path指向安装根目录并使用config选项强制config模式。

find_package 为什么找不到 Config.cmake 文件
根本原因通常是 CMake 没有在你期望的路径里搜索 XXXConfig.cmake 或 xxx-config.cmake。它默认只查系统级路径(如 /usr/lib/cmake/XXX/、/usr/local/share/cmake/XXX/)和 CMAKE_PREFIX_PATH 中列出的前缀路径下的 lib/cmake/XXX/、share/cmake/XXX/ 等子目录,**不会自动递归扫描任意目录**。
常见错误现象包括:
-
find_package(OpenCV REQUIRED)报错Could not find a package configuration file provided by "OpenCV" - 明明本地编译好了库,放到了
/home/user/mydeps/opencv/install/,但 CMake 就是不认
CMAKE_PREFIX_PATH 是最常用也最可靠的指定方式
把你的 Config 文件所在前缀路径加到 CMAKE_PREFIX_PATH,CMake 就会按约定规则去里面找 lib/cmake/XXX/XXXConfig.cmake(或类似路径)。不是直接指定 Config 文件路径,而是指定“安装根目录”。
实操建议:
- 如果 Config 文件在
/path/to/your/install/lib/cmake/MyLib/MyLibConfig.cmake,就传-DCMAKE_PREFIX_PATH=/path/to/your/install - 支持多个路径,用分号分隔(Windows)或冒号分隔(Linux/macOS),例如:
-DCMAKE_PREFIX_PATH="/opt/mylib;/home/user/deps" - 也可以在 CMakeLists.txt 里提前设置:
set(CMAKE_PREFIX_PATH "/path/to/install" ${CMAKE_PREFIX_PATH}),但注意这必须在find_package()之前
NO_MODULE 和 CONFIG 模式要分清
find_package(XXX) 默认先尝试 Module 模式(找 FindXXX.cmake),失败再试 Config 模式。如果你明确只想走 Config 路径,避免被干扰,加上 CONFIG 选项:
find_package(OpenCV CONFIG REQUIRED)
这样 CMake 就跳过所有 FindXXX.cmake,只搜 Config 文件。配合 CMAKE_PREFIX_PATH 使用效果最稳。
注意:
-
NO_MODULE和CONFIG效果等价,但CONFIG更语义清晰,推荐用它 - 如果库同时提供了
FindXXX.cmake和XXXConfig.cmake,不加CONFIG可能意外加载了旧版 Find 模块,导致路径或版本判断出错
PATH_SUFFIXES 和 HINTS 是进阶但易踩坑的写法
极少数情况下,Config 文件没放在标准子路径下(比如直接放在 /my/path/XXXConfig.cmake),可以用 HINTS 直接指定父目录,并配 PATH_SUFFIXES 控制搜索子路径:
find_package(Boost CONFIG REQUIRED HINTS "/my/custom/path" PATH_SUFFIXES "" )
但要注意:
-
PATH_SUFFIXES ""表示“就在 HINTS 目录下直接找”,不拼任何子路径 - 一旦用了
HINTS,CMake 就**不再自动查CMAKE_PREFIX_PATH和系统路径**,除非你显式加上PATHS ${CMAKE_PREFIX_PATH} - 这种写法破坏可移植性,调试困难,仅建议用于临时绕过或集成非标构建产物
绝大多数时候,老老实实把库 install 到规范路径、用 CMAKE_PREFIX_PATH + CONFIG 就够了。硬指定 Config 文件本身(比如 PATHS /xxx/yyy/MyLibConfig.cmake)是无效的——find_package 查的是目录,不是单个文件。











