如何确定CMake中find_package的包名?新手开发者求助
作为从Makefile转CMake的过来人,太懂你复制粘贴find_package代码的迷茫了!其实CMake的包名不是随便取的,这里给你理清楚逻辑和实用方法:
1. 包名的本质对应关系
CMake的find_package指令里的包名,本质是对应两种核心文件:
- CMake自带的查找模块:也就是
Find<PackageName>.cmake格式的文件(比如系统中存在的FindOpenGL.cmake),这时包名就是文件名里Find和.cmake之间的部分——这就是为什么OpenGL要用OpenGL作为包名,而不是OPENGL或opengl,因为模块文件名本身就是这个大小写。 - 库自身提供的配置模块:也就是
<PackageName>Config.cmake格式的文件(比如Vulkan官方提供的VulkanConfig.cmake),这种情况下包名就是配置文件的前缀,完全和库的官方命名保持一致。
2. 快速确定正确包名的方法
- 查CMake官方模块文档:CMake自带的所有Find模块都有详细的官方文档,里面会明确标注
find_package(<正确包名> REQUIRED)的标准用法,还会列出模块提供的变量(比如OPENGL_INCLUDE_DIRS、Vulkan_LIBRARIES这类)。 - 看目标库的官方文档:像OpenGL、Vulkan、GLFW这类流行库,官方文档里都会专门有CMake集成的章节,直接给你正确的
find_package写法,不用自己瞎猜。 - 查看本地CMake模块文件:去你的CMake安装目录下的
share/cmake-<版本号>/Modules文件夹里,找Find*.cmake格式的文件——比如FindGLFW.cmake就对应包名GLFW,一眼就能确认。 - 用cmake命令行验证:打开终端输入
cmake --help-module Find<你猜测的包名>,比如cmake --help-module FindOpenGL,如果能输出模块的帮助信息,说明包名是对的,还能顺便学习模块的用法细节。
3. 通用的命名约定
主流库的CMake包名基本遵循以下约定:
- CMake官方维护的Find模块,一般采用驼峰命名法,和库的官方品牌名称完全一致,比如
OpenGL、GLFW、Boost、SDL2。 - 第三方库自己提供的Config模块,包名通常和库的正式名称保持一致,比如Vulkan就是
Vulkan,不会写成全小写或全大写。 - 少数老旧库可能有例外,但你用到的OpenGL、Vulkan、GLFW这类现代图形API,都严格遵循这个约定。
下次再遇到不确定的包名,按上面的方法排查,就不用再依赖盲目的谷歌搜索复制啦!
内容的提问来源于stack exchange,提问作者user9074174
相关产品推荐
相关产品推荐

