Skip to content

第七章 构建工具 v1.0 ​

第一部分 CMake ​

一、CMake简介 ​

CMake是一个跨平台的构建系统生成工具,通过编写CMakeLists.txt来定义项目的构建过程,可以生成Makefile、Ninja等构建文件。

二、最小项目示例 ​

text
hello/
├── CMakeLists.txt
└── main.cpp

main.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文件,执行其中定义的规则和命令,生成目标文件。

二、作用 ​

  1. 自动化构建:通过定义规则和依赖关系,自动化编译、链接过程
  2. 增量构建:只重新编译发生变化的文件,提高构建效率
  3. 跨平台构建:通过定义不同平台的编译选项实现跨平台构建

三、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 = myprogram
makefile
.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