讲师中心 微信公众号
AI工具推荐 视频效率加速

CMake从入门到精通全流程解析

风辰君_1039

风辰君_1039

发布时间:2026-08-08 19:38:00

|

276人浏览过

|

来源于php中文网

原创

CMake本身不编译代码,只生成构建文件;真正编译由make、ninja或msbuild执行。入门门槛低,但精通难点在于路径管理、目标属性和生成器表达式。

cmake从入门到精通全流程解析

直接说结论:CMake 本身不编译代码,只生成构建文件;真正编译靠 make、ninja 或 msbuild。入门门槛低,但“精通”卡点在路径管理、目标属性和生成器表达式上。

cmake .. 和 cmake -S . -B build 有啥区别?

本质是同一操作,但后者更现代、更安全。前者隐式把当前目录当构建目录(CMAKE_BINARY_DIR == CMAKE_CURRENT_SOURCE_DIR),容易污染源码;后者强制分离源码与构建产物。

  • cmake ..:在 build/ 目录里执行时,会向上找上级目录的 CMakeLists.txt,但缓存(CMakeCache.txt)写在当前目录,一旦误删或混用易出错
  • cmake -S . -B build:明确指定源码目录(-S)和构建目录(-B),CMake 自动创建 build/ 并把所有中间文件锁死在里面
  • Windows 用户尤其要注意:Visual Studio 生成器下,cmake .. 可能因路径含空格或中文触发 CMake Error: The source directory ".../my project" does not exist.

add_executable() 里传相对路径还是绝对路径?

必须传相对于当前 CMakeLists.txt 所在目录的相对路径。CMake 不支持 add_executable(app /abs/path/main.cpp) 这种写法,会报 file not found 或静默忽略。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
  • 正确写法:add_executable(app main.cpp src/utils.cpp),前提是这些文件真正在当前 CMakeLists.txt 同级或子目录下
  • 跨目录引用要配合 add_subdirectory():比如 lib/ 下有自己独立的 CMakeLists.txt,就得先写 add_subdirectory(lib),再用 target_link_libraries(app PRIVATE mylib)
  • 常见坑:add_executable(app ${CMAKE_CURRENT_SOURCE_DIR}/src/main.cpp) 看似合理,但会导致 Ninja 构建失败 —— 因为 Ninja 要求所有源文件路径必须可被构建系统追踪,而变量展开后的绝对路径破坏了这一机制

为什么 set(CMAKE_CXX_STANDARD 17) 没生效?

这条命令只设置默认标准,但不会自动应用到已有 target。它只对后续用 add_executable() 或 add_library() 创建的目标起作用,且会被 target 级别的属性覆盖。

  • 安全写法是:在 add_executable() 之后立刻加 set_property(TARGET app PROPERTY CXX_STANDARD 17)
  • 或者统一用 target_compile_features(app PRIVATE cxx_std_17),它还能做编译器能力检查
  • 注意 CMAKE_CXX_STANDARD_REQUIRED 和 CMAKE_CXX_EXTENSIONS:前者设为 ON 强制拒绝不支持该标准的编译器;后者设为 OFF 可禁用 GNU 扩展(如 __attribute__),提升跨平台兼容性
  • 如果用了 find_package(Threads REQUIRED),线程库链接可能依赖 C++ 标准版本,此时标准没对齐会导致 undefined reference to pthread_create

找不到第三方库?别急着改 CMAKE_PREFIX_PATH

多数情况下不是路径问题,而是 find_package() 的调用时机或模式不对。CMake 查找逻辑是先找 config 模式(*Config.cmake),再 fallback 到 module 模式(Find*.cmake),两者行为差异极大。

  • OpenCV、Qt 等现代库优先走 config 模式,要求你提供 OpenCV_DIR 或 Qt5_DIR 指向其 lib/cmake/opencv4/ 这类目录,而不是库文件所在路径
  • 像 zlib、libpng 这类传统库走 module 模式,依赖 CMAKE_LIBRARY_PATH 和 CMAKE_INCLUDE_PATH,但更推荐用 find_package(zlib REQUIRED) + target_link_libraries(app PRIVATE ZLIB::ZLIB),避免手动拼 include_directories()
  • 最容易被忽略的一点:find_package() 必须在 add_executable() 之前调用,否则 target_link_libraries() 会报 target "app" not found

真正难的从来不是语法,而是理解 CMake 如何把 CMakeLists.txt 映射成 Makefile/Ninja 规则 —— 比如 INTERFACE 属性怎么影响头文件传播,$<build_interface></build_interface> 生成器表达式在 install 时如何切换路径。这些细节不踩几次坑,光看文档根本记不住。

热门AI工具

更多
切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

相关专题

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

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

6646

2025.10.17

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

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

1591

2025.10.23

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

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

354

2025.12.13

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

60

2026.10.16

OpenJDK怎么配置Java开发环境
OpenJDK怎么配置Java开发环境

怎样用OpenJDK搭建开发环境?本专题介绍版本选择、下载安装、环境变量配置和编译运行验证,帮助你理清JDK的作用及基本配置流程,并通过简单程序检查环境是否可用,为后续项目开发做好准备。

40

2026.10.16

OpenJDK怎么部署Java应用
OpenJDK怎么部署Java应用

Java项目开发完成后,怎样部署到目标环境并正常运行?本专题介绍OpenJDK应用部署流程,涵盖运行环境准备、版本兼容检查、应用打包、启动参数配置和日志查看,帮助你理清部署前后的操作顺序,减少环境差异造成的运行问题。

40

2026.10.16

Revel框架模板渲染与表单验证
Revel框架模板渲染与表单验证

本专题围绕Revel框架视图层开发,介绍模板语法、变量输出、布局复用、表单提交、参数绑定与验证规则,帮助开发者完成安全规范的页面交互。

20

2026.10.16

Revel框架MVC路由与控制器
Revel框架MVC路由与控制器

本专题聚焦Revel框架MVC核心机制,讲解路由定义、控制器Action、参数绑定、请求响应和反向路由,并结合常见场景梳理接口请求处理流程。

20

2026.10.16

Revel框架入门与安装配置
Revel框架入门与安装配置

本专题从Revel框架环境搭建讲起,系统介绍命令行工具安装、项目创建、目录结构、配置文件及热代码重载,帮助开发者快速完成首个Go Web应用。

20

2026.10.16

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
LLVM CMake构建指南
LLVM CMake构建指南

共0课时 | 0人学习

LLVM入门手册
LLVM入门手册

共0课时 | 0人学习

CMake 与 Conan 集成实践
CMake 与 Conan 集成实践

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn