从零起步:CMake基础入门与实战跨平台编译

从零起步: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基础入门与实战跨平台编译

✨ 前言:CMake作为跨平台的构建工具,凭借其灵活的语法和强大的跨平台适配能力,成为C/C++开发中编译构建的核心工具。无需依赖复杂的工程配置,仅通过简单的CMakeLists.txt文件,就能实现Windows、Linux、macOS多平台的编译适配。本文将从最基础的环境准备开始,手把手教你编写第一个CMake项目,解锁跨平台编译的入门技巧,全程极简实操,新手也能轻松上手!

📋 前置准备:打好CMake入门的基础

想要玩转CMake,第一步要确保环境搭建到位,同时准备好基础的源码文件,这是后续所有操作的前提,缺一不可。

  1. C M ake环境校验

首先需提前安装CMake工具,在终端/命令行输入cmake --version(注:部分环境为cmake version),若能正常显示版本号,则说明安装成功。本次实操使用的是3.23版本,而第一个基础示例未使用任何CMake新特性,因此3.1、3.2等低版本也可正常运行,对版本无严格要求。

  1. 源码文件准备

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.txtC M akeLists.TXT都能被识别,甚至在Windows系统中,因系统本身对文件名大小写不敏感,各种写法无任何区别。

强烈建议按照默认规范书写为CMakeLists.txt,原因有二:

  1. 提升可读性:行业通用规范,其他开发者能快速识别文件用途,便于协作开发;

  2. 避免跨平台冲突:Linux系统对文件名大小写敏感,若多人协作时,有人写C M akeLists.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)

逐行解析核心配置:

  1. 指定最低版本: cmake_minimum_required(VERSION 3.20)

该命令用于设定编译当前项目所需的CMake最低版本,本次指定为3.20。这样做的核心好处是版本报错前置:当其他开发者拉取项目编译时,若其本地CMake版本低于3.20,会直接在终端/命令行提示版本不匹配,开发者可第一时间升级CMake解决问题;若未指定最低版本,版本不兼容可能导致编译失败且无明确报错信息,排查问题会十分繁琐。

同时,本地机器可安装多个CMake版本,只需切换到指定版本即可编译,灵活度拉满。

  1. 定义项目名称: project(first_cmake)

project()函数用于定义项目的名称,本次项目名称为first_cmake

一个实用的小技巧:CMake语法中,无空格的字符串可以省略双引号 ,若项目名称包含空格(如first cmake demo),则必须用双引号包裹(project("first cmake demo")),这一特性让配置更简洁。

项目名称定义后,会生成对应的CMake变量,后续进阶开发中可直接调用变量,避免多次修改项目名称时的繁琐操作,本次入门示例为了简洁,暂未使用变量。

  1. 构建可执行文件: 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项目吧,从实操中感受跨平台编译的乐趣!

相关推荐
charlie1145141912 小时前
嵌入式现代C++工程实践——第14篇:第二次重构 —— 模板登场,编译时绑定端口和引脚
开发语言·c++·stm32·安全·重构
同勉共进2 小时前
并发编程核心概念辨析
c++·cpu·内存屏障·缓存一致性·memory order
良木生香3 小时前
【C++初阶】C++编程基石:编码表&&STL的入门指南
c语言·开发语言·数据结构·c++·算法
并不喜欢吃鱼3 小时前
从零开始C++----四.vector的使用与底层实现
开发语言·c++
沐雪轻挽萤3 小时前
17. C++17新特性-并行算法 (Parallel Algorithms)
java·开发语言·c++
A7bert7773 小时前
【YOLOv8部署至RDK X5】模型训练→转换bin→Sunrise 5部署
c++·人工智能·python·深度学习·yolo·机器学习
EllinY4 小时前
扩展欧几里得算法 exgcd 详解
c++·笔记·数学·算法·exgcd
量子炒饭大师4 小时前
【C++11】RAII 义体加装指南 ——【包装器 与 异常】C++11中什么是包装器?有哪些包装器?C++常见异常有哪些?(附带完整代码讲解)
开发语言·c++·c++11·异常·包装器
炘爚4 小时前
深入解析内存分区:程序运行的秘密
c++