跳转至

make

用来解释Makefile文件(这里使用GNU make,当然还有别的)。 可以自动化选择编译哪些文件,可以跑不止c++的代码。

格式

1
2
3
4
5
target: dependencies
    commands

target: file1.cpp file2.cpp
    g++ -o target file1.cpp file2.cpp
注意这里是依赖,而不是参数,依赖关系应该是个DAG(有向无环图)。

变量

变量在使用时需要加上美元符号($)和括号,例如:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
# 这是一个注释行
CC=g++
# CFLAGS 是传递给编译器的选项。
CFLAGS= -c -Wall

all: prog

prog: main.o factorial.o hello.o
    $(CC) main.o factorial.o hello.o -o prog

main.o: main.cpp
    $(CC) $(CFLAGS) main.cpp

factorial.o: factorial.cpp
    $(CC) $(CFLAGS) factorial.cpp

hello.o: hello.cpp
    $(CC) $(CFLAGS) hello.cpp

clean:
    rm -rf *.o

自动推导

make的隐含规则

c .PHONY表示clean是一个伪目标文件

内部宏

这些是 make 中预定义的。 使用 make -p 列出当前构建的所有宏、后缀规则和目标

动态更新

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
app : main.o kbd.o command.o
    gcc -o app main.o kbd.o command.o
main.o : main.c defs.h
    gcc -c main.c
kbd.o : kbd.c defs.h command.h
    gcc -c kbd.c
command.o : command.c defs.h command.h
    gcc -c command.c
clean :
    rm app main.o kbd.o \
    command.o

cmake

构建make的工具

资料

TODO bilibili GNU Make 使用手册(中译版) A Short Introduction to Makefile http://www.uinio.com/Linux/CMake/ 跟我一起写 Makefile