第七章 构建工具 v1.0
第一部分 CMake
一、CMake简介
CMake是一个跨平台的构建系统生成工具,通过编写CMakeLists.txt来定义项目的构建过程,可以生成Makefile、Ninja等构建文件。
二、最小项目示例
text
hello/
├── CMakeLists.txt
└── main.cppmain.cpp:
cpp
#include <iostream>
int main() {
std::cout << "Hello from CMake\n";
}CMakeLists.txt:
cmake
cmake_minimum_required(VERSION 3.20)
project(hello LANGUAGES CXX)
add_executable(hello main.cpp)
target_compile_features(hello PRIVATE cxx_std_17)三、常用命令
bash
# 生成构建文件
cmake -S . -B build
# 构建项目
cmake --build build
# 运行程序
./build/hello四、常用指令
| 指令 | 说明 |
|---|---|
| cmake_minimum_required | 设置最低CMake版本 |
| project | 定义项目名称和支持语言 |
| add_executable | 添加可执行文件 |
| add_library | 添加库 |
| target_link_libraries | 链接库 |
| target_include_directories | 添加头文件路径 |
| target_compile_features | 设置编译特性 |
第二部分 make与Makefile
一、make简介
make是一个构建自动化工具,主要用于管理和自动化编译过程。make通过读取Makefile文件,执行其中定义的规则和命令,生成目标文件。
二、作用
- 自动化构建:通过定义规则和依赖关系,自动化编译、链接过程
- 增量构建:只重新编译发生变化的文件,提高构建效率
- 跨平台构建:通过定义不同平台的编译选项实现跨平台构建
三、Makefile基本规则
makefile
target: dependencies
command # 输出命令并执行
@command # 直接执行,不输出命令- target:要生成的目标文件
- dependencies:生成目标文件所依赖的文件
- command:生成目标文件的命令
四、变量与伪目标
makefile
CC = gcc
CFLAGS = -Wall -g
SRCS = main.c utils.c
OBJS = main.o utils.o
TARGET = myprogrammakefile
.PHONY: all clean
all: $(TARGET)
clean:
rm -f $(OBJS) $(TARGET)makefile
CC = gcc
CFLAGS = -Wall -g
SRCS = main.c utils.c
OBJS = main.o utils.o
TARGET = myprogram
$(TARGET): $(OBJS)
$(CC) $(CFLAGS) -o $(TARGET) $(OBJS)
main.o: main.c
$(CC) $(CFLAGS) -c main.c
utils.o: utils.c
$(CC) $(CFLAGS) -c utils.c
.PHONY: clean
clean:
rm -f $(OBJS) $(TARGET)五、特殊变量
| 变量 | 说明 |
|---|---|
$@ | 当前目标文件名 |
$^ | 所有依赖文件 |
$< | 第一个依赖文件 |
$? | 比目标文件新的依赖文件 |
$(MAKE) | 当前make命令 |
六、变量赋值方式
| 方式 | 说明 | 示例 |
|---|---|---|
= | 基本赋值(递归展开) | VAR = value |
:= | 直接赋值(立即展开) | VAR := value |
?= | 条件赋值(未定义时赋值) | VAR ?= value |
+= | 追加赋值 | VAR += value |
七、常用命令
bash
# 执行默认目标
make
# 指定目标
make clean
# 指定Makefile文件
make -f mymakefile
# 显示命令不执行
make -n
# 并行执行
make -j4