CMake find_package指定目录新手入门教程

轻瑶君_1165

轻瑶君_1165

2026-08-09

371人浏览

原创

find_package本质是搜索xxxconfig.cmake或findxxx.cmake文件;xxx_dir仅对config模式生效且须指向含config文件的目录,非库根目录;no_default_path禁用所有默认路径,需配合精确路径使用。

cmake find_package指定目录新手入门教程

直接说结论:find_package 不是“指定目录去搜库”,而是“指定目录去搜 xxxConfig.cmakeFindxxx.cmake 文件”——搞错这个,90% 的路径问题都白调。

为什么 set(xxx_DIR ...) 有时不生效?

因为 xxx_DIR 只对配置模式(Config Mode)起作用,且必须指向包含 xxxConfig.cmake 的目录(不是库安装根目录,更不是 lib/include/ 目录)。常见错误包括:

  • OpenCV_DIR 设成 /usr/local/include/opencv4 → 错,这里没有 OpenCVConfig.cmake
  • 设成 /usr/local/lib/cmake/opencv4 → 对,该路径下应有 OpenCVConfig.cmakeOpenCVConfigVersion.cmake
  • 设了 OpenCV_DIR 却没加 NO_DEFAULT_PATH → CMake 仍会查系统路径,可能加载了旧版本

正确写法示例(命令行传入):

cmake -DOpenCV_DIR=/path/to/opencv/build/install/lib/cmake/opencv4 ..

或在 CMakeLists.txt 中提前设置(需在 find_package(OpenCV ...) 之前):

set(OpenCV_DIR "/path/to/opencv/build/install/lib/cmake/opencv4" CACHE PATH "")
find_package(OpenCV REQUIRED)

如何让 find_package 找到自己编译安装的 yaml-cpp?

yaml-cpp 安装后一般生成 yaml-cpp-config.cmake,但路径不标准(比如装在 ~/3rdparty/yaml-cpp-1.12.0 下,而 config 文件实际在 lib/cmake/yaml-cpp/ 子目录)。这时必须显式告诉 CMake 去哪找:

  • 不能只设 yaml-cpp_DIR 为安装根目录(~/3rdparty/yaml-cpp-1.12.0),要精确到 config 所在目录
  • 推荐用 set(yaml-cpp_DIR ...) + NO_DEFAULT_PATH 组合,避免和系统包冲突
  • 注意名字大小写:yaml-cpp 的 config 文件名是 yaml-cpp-config.cmake,所以变量名必须是 yaml-cpp_DIR(含连字符),不是 YAMLCPP_DIRYamlCpp_DIR

实操代码片段:

C++ 算法竞赛自动化测试数据生成与校验框架
C++ 算法竞赛自动化测试数据生成与校验框架

根据原题生成新题面、验证器及完整测试数据,自动套用 testlib 模板,用于用户要求生成测试数据时。

下载
set(yaml-cpp_DIR "${CMAKE_CURRENT_LIST_DIR}/3rdparty/yaml-cpp-1.12.0/lib/cmake/yaml-cpp" CACHE PATH "")
find_package(yaml-cpp 1.12.0 REQUIRED NO_DEFAULT_PATH)

MODULE 模式下怎么加自定义 FindXXX.cmake

当你用的库没提供 XXXConfig.cmake(比如老版本 Boost、自制小模块),就得走模块模式。关键不是“放对位置”,而是“让 CMake 看得到”:

  • CMAKE_MODULE_PATH 是唯一入口,它默认为空,必须手动 list(APPEND CMAKE_MODULE_PATH ...)
  • 路径必须是绝对路径;相对路径要用 ${CMAKE_CURRENT_LIST_DIR} 展开
  • find_package(my_test MODULE REQUIRED) 中的 MODULE 是强制开关,不加的话 CMake 仍会先试 Config 模式,失败才 fallback
  • 文件名必须严格为 Findmy_test.cmake(驼峰或下划线都按你写的包名来,不自动转换)

示例结构:

project/
├── CMakeLists.txt
├── cmake/
│   └── Findmy_test.cmake  ← 必须叫这个名字
└── src/...

对应 CMakeLists.txt 片段:

list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake")
find_package(my_test MODULE REQUIRED)

NO_DEFAULT_PATH 到底要不要加?

加不加取决于你是否想彻底隔离环境。不加时,CMake 会按固定顺序查一堆路径(/usr/lib/cmake//opt/homebrew/lib/cmake/CMAKE_PREFIX_PATH 等),容易加载错版本;加了之后,只查你明确给的路径(如 xxx_DIRHINTS),更可控但调试时容易“找不到”:

  • CI 构建或容器内部署:强烈建议加 NO_DEFAULT_PATH,避免污染
  • 本地开发多版本共存:加 NO_DEFAULT_PATH + 显式设 xxx_DIR,最稳
  • 只是临时试一个系统包(如 apt 安装的 OpenCV):不加,让它自动发现
  • 混用时(比如主库用自定义路径,辅助工具用系统路径):改用 HINTSPATHS,比 NO_DEFAULT_PATH 更细粒度

一个易忽略的点:NO_DEFAULT_PATH 会禁用所有默认路径,包括 CMAKE_PREFIX_PATH 和注册表,不是只关系统路径。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
C++ 跨平台开发
C++ 跨平台开发

本专题聚焦 C++ 在跨平台应用与工程构建中的实战应用,系统讲解 CMake 构建系统、跨平台编译配置、第三方库集成、调试技巧、静态与动态链接库管理等核心知识。通过实战案例(如跨平台工具开发、Linux与Windows编译兼容性项目),帮助学习者掌握 从环境配置到完整跨平台构建的开发能力。

2025.10.17

5326

15

c++  cmake用法
c++ cmake用法

本专题整合了c++ cmake用法相关教程,阅读专题下面的文章了解更多详细内容。

2025.10.23

1391

14

C++ 编译构建系统与CMake实战
C++ 编译构建系统与CMake实战

本专题聚焦 C++ 项目的编译与构建体系,系统讲解 CMake 的核心语法、项目结构设计、库与依赖管理、跨平台构建、调试与发布配置。通过完整项目示例,帮助开发者掌握 从源码到可执行程序的工程化构建流程,提升 C++ 项目在实际开发中的可维护性与扩展性。

2025.12.13

314

18

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

2026.09.23

0

15

Buffalo框架路由与请求处理实操指南
Buffalo框架路由与请求处理实操指南

本专题讲解Buffalo框架路由与请求处理机制,涵盖路由注册与分组、资源路由、Handler编写规范、Context上下文方法、参数绑定、中间件编写挂载、Session与Cookie读写、Flash消息及错误页面定制方法。

2026.09.23

0

15

Buffalo框架零基础入门教程
Buffalo框架零基础入门教程

本专题整理Buffalo框架入门内容,涵盖Go环境准备、buffalo CLI安装、新项目生成、目录结构说明、dev热加载启动、数据库连接配置与常见报错排查,帮助新手按约定优于配置的思路跑通第一个Buffalo框架应用。

2026.09.23

0

15

Conan创建软件包配方指南
Conan创建软件包配方指南

本专题介绍通过conanfile.py创建软件包的方法,讲解包名、版本、依赖和构建设置等基础信息,以及source、build、package、package_info等常用方法的作用及编写思路。

2026.09.22

0

12

Conan二进制包配置指南
Conan二进制包配置指南

本专题介绍Conan根据操作系统、编译器、架构和构建类型生成二进制包的方法,讲解Profile、Settings、Options及Package ID的作用,帮助管理不同平台和编译环境下的包版本。

2026.09.22

0

13

Conan私有仓库搭建教程
Conan私有仓库搭建教程

本专题系统的讲解Conan私有仓库的搭建流程,涵盖仓库服务部署、存储目录配置、用户认证、权限划分和远程地址添加,并介绍内部C++依赖包的上传、下载及版本维护方法。

2026.09.22

0

19

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
CMake 与 Conan 集成实践
CMake 与 Conan 集成实践

共0课时 | 0人学习

Conan 2 入门教程
Conan 2 入门教程

共0课时 | 0人学习

CLion CMake 快速入门教程
CLion CMake 快速入门教程

共0课时 | 0人学习