从入门到精通:CMakeLists.txt 完全指南

发布于:2025-05-01 ⋅ 阅读:(52) ⋅ 点赞:(0)

从入门到精通:CMakeLists.txt 完全指南

CMake 是一个跨平台的自动化构建系统,它使用名为 CMakeLists.txt 的配置文件来控制软件的编译过程。无论你是刚接触 CMake 的新手,还是希望提升 CMake 技能的中级开发者,这篇指南都将带你从基础到高级全面掌握 CMakeLists.txt 的编写技巧。

一、CMake 基础入门

1.1 什么是 CMake?

CMake 是一个跨平台的开源构建系统,它通过读取 CMakeLists.txt 文件中的指令来生成标准的构建文件(如 Unix 的 Makefile 或 Windows 的 Visual Studio 项目文件)。CMake 的主要优势在于:

  • 跨平台性:可以生成适用于不同操作系统和编译器的构建文件
  • 简化构建过程:自动处理依赖关系和编译顺序
  • 模块化设计:支持大型项目的模块化管理
  • 可扩展性:可以通过自定义命令和函数扩展功能

1.2 最简单的 CMakeLists.txt

让我们从一个最简单的 “Hello World” 项目开始:

# 指定 CMake 的最低版本要求
cmake_minimum_required(VERSION 3.10)

# 设置项目名称
project(HelloWorld)

# 添加可执行文件
add_executable(HelloWorld main.cpp)

这个简单的 CMakeLists.txt 文件包含三个基本指令:

  1. cmake_minimum_required:指定构建此项目所需的最低 CMake 版本
  2. project:定义项目名称和相关信息
  3. add_executable:指定要生成的可执行文件和源文件

1.3 构建过程

使用这个 CMakeLists.txt 文件的典型构建流程是:

mkdir build  # 创建构建目录(推荐外部构建)
cd build     # 进入构建目录
cmake ..     # 生成构建系统
make         # 编译项目

这种"外部构建"的方式(在单独的 build 目录中构建)是推荐的做法,因为它不会污染源代码目录。

二、CMakeLists.txt 核心语法详解

2.1 基本指令深入

2.1.1 project() 指令

project() 指令不仅可以指定项目名称,还可以设置版本、描述和使用的编程语言:

project(MyProject 
        VERSION 1.0.0 
        DESCRIPTION "A sample CMake project"
        LANGUAGES CXX)
  • VERSION:设置项目版本号
  • DESCRIPTION:项目描述信息
  • LANGUAGES:指定项目使用的编程语言(C 表示 C 语言,CXX 表示 C++)
2.1.2 添加可执行文件

add_executable() 指令用于生成可执行文件:

add_executable(TargetName source1.cpp source2.cpp header1.h)

CMake 会自动识别 .cpp 文件为源文件,.h 文件为头文件。虽然头文件可以列出,但通常不需要,除非它们包含需要被 moc 或其他预处理器处理的代码。

2.1.3 添加库文件

使用 add_library() 可以创建库文件:

add_library(LibraryName STATIC source1.cpp source2.cpp)

库的类型可以是:

  • STATIC:静态库(.a 或 .lib)
  • SHARED:动态库(.so 或 .dll)
  • MODULE:模块库(不被链接,但可能被运行时加载)

2.2 变量与属性

2.2.1 变量设置与使用

CMake 使用 set() 命令定义变量:

set(MY_VARIABLE "Hello World")
set(SOURCE_FILES main.cpp utils.cpp)

使用 ${} 语法引用变量:

message(STATUS "The value is: ${MY_VARIABLE}")
add_executable(MyApp ${SOURCE_FILES})
2.2.2 缓存变量

缓存变量会保存在 CMakeCache.txt 中,可以在后续构建中使用:

set(MY_CACHE_VAR "DefaultValue" CACHE STRING "A description of this variable")

缓存变量可以在命令行通过 -D 选项设


网站公告

今日签到

点亮在社区的每一天
去签到