news 2026/4/18 11:55:55

CMake 教程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CMake 教程

CMake 教程:从入门到实战(2025版)

CMake 是现代 C/C++ 项目最流行的构建系统工具,它跨平台、强大且灵活,能生成 Makefile、Ninja、Visual Studio 项目等。本教程从零基础开始,逐步带你掌握 CMake 的核心概念和实际使用。

1. 什么是 CMake?
  • CMake 是一个构建系统生成器(build system generator),不是直接编译器。
  • 它通过读取CMakeLists.txt文件,生成适合当前平台的原生构建工具(如 Makefile 或 VS 项目)。
  • 支持 Windows、Linux、macOS,以及 Android、iOS 等。
2. 安装 CMake
  • Windows:去官网 https://cmake.org/download/ 下载安装包,安装时勾选“Add CMake to PATH”。
  • macOSbrew install cmake
  • Linux (Ubuntu/Debian)sudo apt install cmake
  • 验证安装:终端运行cmake --version
3. 第一个 CMake 项目:Hello World

项目结构:

hello/ ├── CMakeLists.txt ├── main.cpp

main.cpp

#include<iostream>intmain(){std::cout<<"Hello, CMake!"<<std::endl;return0;}

CMakeLists.txt(最简版)

cmake_minimum_required(VERSION 3.10) # 指定最低 CMake 版本 project(HelloCMake) # 项目名称 add_executable(hello main.cpp) # 生成可执行文件 hello,源文件是 main.cpp

构建步骤

cdhellomkdirbuild# 推荐:构建目录与源码分离cdbuild cmake..# 生成构建系统(Makefile 等)cmake --build.# 编译(等价于 make)./hello# 运行程序

输出:Hello, CMake!

4. 核心命令详解
命令作用示例
cmake_minimum_required(VERSION x.y)指定最低 CMake 版本cmake_minimum_required(VERSION 3.15)
project(name [LANGUAGES CXX C])定义项目名和语言project(MyApp LANGUAGES CXX)
add_executable(target sources...)生成可执行文件add_executable(app main.cpp util.cpp)
`add_library(target [STATICSHARED] sources…)`生成库
`target_include_directories(target [PUBLICPRIVATE] dirs…)`添加头文件路径
target_link_libraries(target libs...)链接库target_link_libraries(app PRIVATE pthread)
5. 多文件、多目录项目示例

项目结构:

myproject/ ├── CMakeLists.txt ├── main.cpp ├── src/ │ ├── math.cpp │ └── math.h └── include/ └── math.h (可复制或符号链接)

根目录 CMakeLists.txt

cmake_minimum_required(VERSION 3.10) project(MyProject LANGUAGES CXX) # 添加子目录 add_subdirectory(src) add_executable(myapp main.cpp) target_link_libraries(myapp PRIVATE mathlib) target_include_directories(myapp PRIVATE include)

src/CMakeLists.txt

add_library(mathlib STATIC math.cpp) target_include_directories(mathlib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/..) # 暴露头文件
6. 常用变量与最佳实践
变量含义
${CMAKE_SOURCE_DIR}项目根目录
${CMAKE_BINARY_DIR}构建目录(build)
${CMAKE_CURRENT_SOURCE_DIR}当前 CMakeLists.txt 所在目录
${PROJECT_NAME}项目名称

推荐实践

  • 始终使用 out-of-source build(在 build 目录构建)。
  • 使用target_*命令而不是全局include_directories()link_directories()(现代 CMake 风格)。
7. 设置 C++ 标准
set(CMAKE_CXX_STANDARD 17) # 全局设置 set(CMAKE_CXX_STANDARD_REQUIRED ON) # 或者针对特定目标 target_compile_features(myapp PRIVATE cxx_std_20)
8. 查找外部库(FindPackage)

示例:使用 OpenCV

find_package(OpenCV REQUIRED) target_link_libraries(myapp PRIVATE ${OpenCV_LIBS}) target_include_directories(myapp PRIVATE ${OpenCV_INCLUDE_DIRS})

常见包:Boost、Qt、Eigen、pthread 等。

9. 安装与打包
install(TARGETS myapp DESTINATION bin) install(FILES config.yaml DESTINATION etc/myapp) # 生成安装包(CPack) include(InstallRequiredSystemLibraries) set(CPACK_PACKAGE_NAME "MyApp") set(CPACK_GENERATOR "DEB;RPM;ZIP") include(CPack)

运行cpack生成安装包。

10. 调试与常用选项
  • -DCMAKE_BUILD_TYPE=Debug/Release:设置构建类型
  • -G "Ninja":使用 Ninja 构建(更快)
  • ctest:运行测试(结合add_test()
11. 进阶:现代 CMake 推荐写法(CMake 3.15+)
cmake_minimum_required(VERSION 3.15) project(MyApp LANGUAGES CXX) add_executable(${PROJECT_NAME} main.cpp) target_sources(${PROJECT_NAME} PRIVATE src/util.cpp) target_include_directories(${PROJECT_NAME} PRIVATE include) target_compile_features(${PROJECT_NAME} PRIVATE cxx_std_17)
小结

CMake 的学习曲线虽陡,但掌握后能极大提升项目管理效率。核心原则:

  1. target_*命令管理依赖(现代方式)。
  2. 源码与构建分离。
  3. 明确指定 C++ 标准。
  4. 多用变量和函数提高可维护性。

如果你有具体需求(如集成 Qt、生成 VS 项目、交叉编译、单元测试等),欢迎继续提问,我可以提供针对性的示例!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 22:48:31

12、跨平台应用用户账户集成指南

跨平台应用用户账户集成指南 1. 应用变量设置与索引控制器更新 在应用开发中,我们首先要对索引控制器进行更新,它是应用的起始点,主要用于确认用户的登录状态,并根据用户是否登录将其导向合适的控制器。 1.1 索引控制器基础设置 我们需要检查用户是否已登录应用或是否有…

作者头像 李华
网站建设 2026/4/18 8:40:56

AI数独终极指南:照片秒变数独答案的智能解题神器

AI数独终极指南&#xff1a;照片秒变数独答案的智能解题神器 【免费下载链接】AI_Sudoku GUI based Smart Sudoku Solver that tries to extract a sudoku puzzle from a photo and solve it 项目地址: https://gitcode.com/gh_mirrors/ai/AI_Sudoku 还在为复杂的数独题…

作者头像 李华
网站建设 2026/4/18 5:34:01

21、应用设置与用户管理功能实现

应用设置与用户管理功能实现 在应用开发中,设置与用户管理功能是提升用户体验的重要部分。下面将详细介绍如何实现用户注销、设置用户头像以及获取用户账户额外信息等功能。 1. 用户注销功能实现 用户注销是设置选项卡的主要功能之一。为了实现该功能,需要完成以下几个步骤…

作者头像 李华
网站建设 2026/4/18 5:17:30

图解说明AXI DMA在SoC中的连接方式

深入理解AXI DMA&#xff1a;从原理到SoC系统中的实战连接你有没有遇到过这样的场景&#xff1f;CPU明明没做什么复杂计算&#xff0c;系统却卡得不行。查看负载发现&#xff0c;数据搬运占了大头——比如摄像头源源不断地送帧进来&#xff0c;网络包一个接一个地收&#xff0c…

作者头像 李华
网站建设 2026/4/18 10:07:48

trace.moe技术深度解析:如何实现秒级动漫场景精准搜索

trace.moe技术深度解析&#xff1a;如何实现秒级动漫场景精准搜索 【免费下载链接】trace.moe trace.moe - 一个动漫场景搜索引擎&#xff0c;能够识别动漫截图中的场景并提供具体出自哪一集的信息。 项目地址: https://gitcode.com/gh_mirrors/tr/trace.moe 在动漫爱好…

作者头像 李华
网站建设 2026/4/18 6:41:30

STM32离线烧写器实战指南:告别电脑束缚的终极烧写方案

STM32离线烧写器实战指南&#xff1a;告别电脑束缚的终极烧写方案 【免费下载链接】OfflineSWD STM32系列离线烧写器 项目地址: https://gitcode.com/gh_mirrors/of/OfflineSWD 在嵌入式开发的世界里&#xff0c;你是否曾因现场无法连接电脑而束手无策&#xff1f;是否在…

作者头像 李华