从入门到精通: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 文件包含三个基本指令:
cmake_minimum_required
:指定构建此项目所需的最低 CMake 版本project
:定义项目名称和相关信息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
选项设