使用makefile

makefile规则

1
2
3
4
target: prerequisites
command
...
...

target可以是一个目标文件,也可以是一个执行文件。
prerequisites是要生成target所需要的文件或是目标。
command是make需要执行的命令。(任意的shell命令)
target这一个或多个目标文件依赖于prerequisites中的文件,其生成规则定义在command中。
prerequisites中如果有一个以上的文件比target文件要新的话,command所定义的命令就会被执行。

示例

如一个工程有3个头文件,5个c文件,makefile如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
edit: main.o command.o display.o insert.o search.o #后面的.o文件比edit可执行文件新,才会执行下面的命令
gcc -o edit main.o command.o display.o insert.o search.o #一定要以tab开头

main.o: main.c defs.h
gcc -c main.c
command.o: command.c defs.h command.h
gcc -c command.c
display.o: display.c defs.h buffer.h
gcc -c display.c
insert.o: insert.c defs.h buffer.h
gcc -c insert.c
search.o: search.c defs.h buffer.h
clean:
rm edit main.o command.o display.o insert.o search.o

文件保存为“makefile”或“Makefile”,在该目录下执行make就可以生成可执行文件edit。要删除生成的文件就执行make clean

makefile中使用变量

makefile起始处声明变量:

1
OBJ = main.o command.o display.o insert.o search.o

这样就可以在makefile中用$(OBJ)来使用这个变量了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
OBJ = main.o command.o display.o insert.o search.o
edit: $(OBJ)
gcc -o edit $(OBJ)
main.o: main.c defs.h
gcc -c main.c
command.o: command.c defs.h command.h
gcc -c command.c
display.o: display.c defs.h buffer.h
gcc -c display.c
insert.o: insert.c defs.h buffer.h
gcc -c insert.c
search.o: search.c defs.h buffer.h
clean:
rm edit main.o command.o display.o insert.o search.o

makefile自动推导

makefile看到一个o文件,就会把c文件加到依赖关系中,并且gcc -c *.c也会被推导出来:

1
2
3
4
5
6
7
8
9
10
11
OBJ = main.o command.o display.o insert.o search.o
CC = gcc
edit: $(OBJ)
$(CC) -o edit $(OBJ)
main.o: defs.h
command.o: defs.h command.h
display.o: defs.h buffer.h
insert.o: defs.h buffer.h
search.o: defs.h buffer.h
clean:
rm edit $(OBJ)

C++的makefile

1
2
3
4
5
6
7
8
9
10
11
CC = g++
STD = -std=c++11
SRC = main.cpp student.cpp
OBJ = main.o student.o

main: $(OBJ)
$(CC) $(STD) $(OBJ) -o $@ #$@表示生成的文件名为第一个目标文件的名字
$(OBJ): student.h
$(CC) $(STD) -c $(SRC)
clean:
rm -f main $(OBJ)