从零起步:CMake基础入门与跨平台编译实战
- [Bilibili 同步视频](#Bilibili 同步视频)
- [📋 前置准备:打好CMake入门的基础](#📋 前置准备:打好CMake入门的基础)
- [📂 项目目录规划:简洁至上,便于管理](#📂 项目目录规划:简洁至上,便于管理)
- [✍️ 编写基础源码:极简Hello World版C++程序](#✍️ 编写基础源码:极简Hello World版C++程序)
- [📝 核心配置:编写CMakeLists.txt文件](#📝 核心配置:编写CMakeLists.txt文件)
-
- [🔤 文件名规则:大小写不敏感,但有最佳实践](#🔤 文件名规则:大小写不敏感,但有最佳实践)
- [🧩 基础语法配置:三步完成最简CMakeLists.txt](#🧩 基础语法配置:三步完成最简CMakeLists.txt)
- [🌐 跨平台编译计划:多平台验证,看CMake的跨平台能力](#🌐 跨平台编译计划:多平台验证,看CMake的跨平台能力)
- [💡 入门小结:CMake基础核心就是这么简单](#💡 入门小结:CMake基础核心就是这么简单)
Bilibili 同步视频
✨ 前言:CMake作为跨平台的构建工具,凭借其灵活的语法和强大的跨平台适配能力,成为C/C++开发中编译构建的核心工具。无需依赖复杂的工程配置,仅通过简单的CMakeLists.txt文件,就能实现Windows、Linux、macOS多平台的编译适配。本文将从最基础的环境准备开始,手把手教你编写第一个CMake项目,解锁跨平台编译的入门技巧,全程极简实操,新手也能轻松上手!
📋 前置准备:打好CMake入门的基础
想要玩转CMake,第一步要确保环境搭建到位,同时准备好基础的源码文件,这是后续所有操作的前提,缺一不可。
- C M ake环境校验
首先需提前安装CMake工具,在终端/命令行输入cmake --version(注:部分环境为cmake version),若能正常显示版本号,则说明安装成功。本次实操使用的是3.23版本,而第一个基础示例未使用任何CMake新特性,因此3.1、3.2等低版本也可正常运行,对版本无严格要求。
- 源码文件准备
CMake可脱离C/C++代码单独运行,作为脚本工具使用,但日常开发中,其核心用途是编译源码。本次入门示例我们准备了first_cmake.cpp源码文件,代码内容极简,仅实现基础的控制台输出,后续会全程手写实现,让大家清晰掌握每一个细节。
📂 项目目录规划:简洁至上,便于管理
本次第一个CMake示例为基础入门款,无需复杂的目录结构,我们将项目编号为101(第一章节第一个示例),核心源码文件first_cmake.cpp放在src目录下。因暂未涉及库文件关联,无需多级目录嵌套,独立的简单目录结构足以满足需求,后续随着项目复杂度提升,会逐步引入树形目录结构,让文件管理更规范。
这种极简的目录规划,既降低了入门的理解成本,也能让我们将注意力集中在CMake本身的语法和使用上,避免被复杂的目录配置分散精力。
✍️ 编写基础源码:极简Hello World版C++程序
一切准备就绪后,我们先编写first_cmake.cpp源码,使用VS Code、记事本等任意文本编辑工具均可,VS Code的自动提示功能能让编写过程更高效。
源码的核心需求是实现控制台输出,完成一个极简的入口程序,代码如下:
cpp
#include <iostream>
using namespace std;
int main() {
// 第一个CMake测试程序,控制台输出核心信息
cout << "first CMake test:这是我的第一个CMake项目!" << endl;
return 0;
}
这段代码仅包含基础的头文件引入、主函数入口和控制台输出,无复杂逻辑,目的是为了配合CMake完成最基础的编译流程,让大家直观看到CMake的编译效果。
📝 核心配置:编写CMakeLists.txt文件
CMakeLists.txt是CMake的核心配置文件,所有的编译规则、项目信息、源码关联都通过该文件定义,这也是CMake跨平台编译的关键。接下来我们从文件名规则到具体语法,一步步实现基础配置,解锁CMake的核心用法。
🔤 文件名规则:大小写不敏感,但有最佳实践
CMake对CMakeLists.txt的文件名大小写完全不敏感 ,比如写为cmakelists.txt、C M akeLists.TXT都能被识别,甚至在Windows系统中,因系统本身对文件名大小写不敏感,各种写法无任何区别。
但强烈建议按照默认规范书写为CMakeLists.txt,原因有二:
-
提升可读性:行业通用规范,其他开发者能快速识别文件用途,便于协作开发;
-
避免跨平台冲突:Linux系统对文件名大小写敏感,若多人协作时,有人写
CMakeLists.txt,有人写cmakelists.txt,在Linux中会被识别为两个不同文件,导致编译报错,而Windows中无此问题,统一规范可从根源避免该问题。
🧩 基础语法配置:三步完成最简CMakeLists.txt
最简的CMakeLists.txt仅需三步核心配置:指定CMake最低版本、定义项目名称、关联源码并构建可执行文件,全程无复杂语法,新手轻松掌握。以下是完整的配置代码,搭配详细注释,逐行解析每一个配置的意义。
CMake
# 注释:指定CMake的最低版本要求为3.20
cmake_minimum_required(VERSION 3.20)
# 注释:定义项目名称为first_cmake,CMake中无空格的字符串可省略双引号
project(first_cmake)
# 注释:构建可执行文件,第一个参数为可执行文件名称,第二个参数为关联的源码文件
add_executable(first_cmake src/first_cmake.cpp)
逐行解析核心配置:
- 指定最低版本:
cmake_minimum_required(VERSION 3.20)
该命令用于设定编译当前项目所需的CMake最低版本,本次指定为3.20。这样做的核心好处是版本报错前置:当其他开发者拉取项目编译时,若其本地CMake版本低于3.20,会直接在终端/命令行提示版本不匹配,开发者可第一时间升级CMake解决问题;若未指定最低版本,版本不兼容可能导致编译失败且无明确报错信息,排查问题会十分繁琐。
同时,本地机器可安装多个CMake版本,只需切换到指定版本即可编译,灵活度拉满。
- 定义项目名称:
project(first_cmake)
project()函数用于定义项目的名称,本次项目名称为first_cmake。
一个实用的小技巧:CMake语法中,无空格的字符串可以省略双引号 ,若项目名称包含空格(如first cmake demo),则必须用双引号包裹(project("first cmake demo")),这一特性让配置更简洁。
项目名称定义后,会生成对应的CMake变量,后续进阶开发中可直接调用变量,避免多次修改项目名称时的繁琐操作,本次入门示例为了简洁,暂未使用变量。
- 构建可执行文件:
add_executable(first_cmake src/first_cmake.cpp)
add_executable()是构建可执行文件的核心命令,参数规则为:第一个参数是生成的可执行文件名称 (可与项目名称一致),第二个及后续参数是需要关联的源码文件(支持多个源码文件,用空格分隔)。
本次将src目录下的first_cmake.cpp关联到可执行文件,CMake会根据该配置,将源码编译为指定名称的可执行程序。
补充:实际开发中,若源码文件较多,可使用CMake的函数自动查找源码文件,无需手动逐个写入;而鸿蒙源码开发中要求手动写入所有源码文件名,便于精准控制编译流程,大家可根据项目需求选择方式。
🌐 跨平台编译计划:多平台验证,看CMake的跨平台能力
编写好源码和CMakeLists.txt后,即可开始编译操作,本次我们将在三大主流平台完成编译验证:
-
Windows:使用Win11系统,可通过VS Code编译,也可直接用VS打开CMakeLists.txt文件编译;
-
Linux:使用Ubuntu 20.04系统,通过终端执行CMake编译命令;
-
macOS:使用最新版本系统,适配原生终端编译。
就第一个基础示例而言,三大平台的编译结果无任何差异,因为未涉及到库文件的编译;而后续进阶学习动态库、静态库时,三大平台的编译规则、生成的库文件格式会存在明显区别,这也是CMake跨平台开发中需要重点关注的点,后续会专门讲解库文件的跨平台编译技巧。
💡 入门小结:CMake基础核心就是这么简单
本次从零起步的CMake入门实操,核心就是掌握一个核心文件(CMakeLists.txt)+ 三步基础配置 + 跨平台编译思路,看似复杂的跨平台编译工具,入门阶段的核心内容其实极简。
通过本次实操,我们不仅完成了第一个CMake项目的编写和配置,还掌握了CMake的基础语法、文件名规范、版本指定等实用技巧,这些都是后续进阶学习CMake的基础。后续我们会逐步增加项目复杂度,讲解库文件编译、变量使用、自动查找源码等进阶内容,让大家真正玩转CMake,轻松应对跨平台开发的编译需求。

CMake的学习遵循由简到繁、边练边学的原则,打好基础后,后续的进阶内容会水到渠成,赶紧动手尝试自己编写第一个CMake项目吧,从实操中感受跨平台编译的乐趣!