1.Makefile要解决的问题
1、如果工程没有编译过,那么工程中的所有.c 文件都要被编译并且链接成可执行程序。
2、如果工程中只有个别 C 文件被修改了,那么只编译这些被修改的 C 文件即可。
3、如果工程的头文件被修改了,那么我们需要编译所有引用这个头文件的 C 文件,并且
链接成可执行文件。
总之就是解决几千个文件的编译问题, 提高编译效率。
2.Makefile注意事项
1.命令缩进一定要使用TAB键, 这是Makefile语法规则决定的;
2.Makefile文件名区分大小写, 文件名一定是Makefile。
3.Makefile基本规则
Makefile由一系列规则构成, 如下
终极目标:依赖的文件集合
命令1
命令2
…
比如如下规则:
main: main.o file1.o file2.o
gcc main.o file1.o file2.o -o main
main.o: main.c
gcc -c main.c
file1.o: file1.c
gcc -c file1.c
file2.o: file2.c
gcc -c file2.c
clean:
rm main
rm *.o
这条规则的目标是main, 依赖的文件是main.o, file1.o, file2.o。第一次编译的时候由于main不存在,因此会执行第一条规则, 第一条规则依赖main.o file1.o file2.o, 这三个.o文件还不存在, 因此先更新这三个.o文件, make会查找以这三个.o文件为目标的规则并执行。
4.自动变量
常用自动变量:
$@ --> 规则中的目标
$< --> 规则中的第一个依赖条件
$^ --> 规则中的所有依赖条件
模式规则:
模式规则是在目标及依赖条件中使用%来匹配对应的文件,比如在目录下有main.c, func1.c, func2.c三个文件,对这三个文件的编译可以由一条规则完成:
%.o:%.c
$(CC) –c $< -o $@
这条模式规则表示:
main.o由main.c生成,
func1.o由func1.c生成,
func2.o由func2.c生成
这就是模式规则的作用,可以一次匹配目录下的所有文件。