find_package只查找已安装的库,需先执行make install生成xxxconfig.cmake并置于cmake可搜索路径;若未安装或配置不全,则需手动设置cmake_prefix_path或foo_dir,或退用find_path/find_library等底层命令。

直接给结论:find_package 本身不查找源码,它只查找**已安装**的库——也就是说,你必须先 make install(或等效操作),让库把 xxxConfig.cmake 或 Findxxx.cmake 放到 CMake 能扫到的位置,find_package 才可能生效。
为什么源码目录里调 find_package 总是失败?
因为 find_package 的搜索路径默认不含你的源码根目录或 build/ 目录。它按固定顺序查:
-
CMAKE_PREFIX_PATH指定的路径(优先级最高) -
/usr/local、/opt/homebrew、C:/Program Files/等系统级安装前缀 - CMake 自带模块路径(如
FindOpenCV.cmake)
源码编译后若没 install,头文件和库文件就散落在 build/ 或 src/ 里,find_package 压根不会进去翻。
想用 find_package 找自己刚编译的库,必须做三件事
以你刚从 GitHub clone 并 cmake && make 编译完的 libfoo 为例:
- 确认该库的 CMakeLists.txt 里有
install(EXPORT ...)和export(PACKAGE ...),否则make install不会生成FooConfig.cmake - 执行
make install(或cmake --install . --prefix /path/to/install),把配置文件和库装到某个目录(比如/tmp/foo-install) - 在你的项目
CMakeLists.txt中提前设置:set(CMAKE_PREFIX_PATH "/tmp/foo-install ${CMAKE_PREFIX_PATH}")
之后再写 find_package(Foo REQUIRED),CMake 就会去 /tmp/foo-install 下找 FooConfig.cmake。
没 install 权限或不想装系统?试试 Config 模式手动指定路径
如果只是临时测试,又不能 sudo make install,可以绕过搜索逻辑,直接告诉 CMake 配置文件在哪:
- 先手动找到生成的
FooConfig.cmake(通常在build/install/lib/cmake/foo/或build/lib/cmake/foo/) - 在
find_package前加:set(Foo_DIR "/path/to/FooConfig.cmake/dir") - 再调用:
find_package(Foo REQUIRED)
注意:Foo_DIR 必须指向包含 FooConfig.cmake 的**目录**,不是文件路径;且这个变量名严格匹配包名(大小写敏感)。
实在没法走 Config 模式?退回到 Module 模式或底层命令
当源码库没提供 FooConfig.cmake,也没自带 FindFoo.cmake 时,find_package(Foo) 会 fallback 到 Module 模式,但大概率失败——因为 CMake 自带的 Find*.cmake 不可能覆盖所有小众库。
这时更实际的做法是跳过 find_package,改用底层命令:
find_path(FOO_INCLUDE_DIR NAMES foo.h PATHS ${FOO_SOURCE_DIR}/include)find_library(FOO_LIBRARY NAMES foo PATHS ${FOO_BUILD_DIR}/lib)- 然后手动
target_include_directories(myapp PRIVATE ${FOO_INCLUDE_DIR})和target_link_libraries(myapp PRIVATE ${FOO_LIBRARY})
这不是最佳实践,但对未打包的源码依赖,它最可控、最少坑。
真正容易被忽略的是:Config 模式依赖库作者是否规范导出目标。很多开源项目只做了 install(TARGETS ...),却漏了 install(EXPORT ...),导致 FooConfig.cmake 根本不生成——这种情况下,哪怕你 make install 了,find_package 还是找不到。











