Makefile是Linux下编译C/C++的利器,它定义了整个项目的编译规则
Makefile基本构成:
最基本的Makefile格式是:
目标:依赖文件
[Tab] 命令
目标是想要生成的文件
依赖文件是为了生成该文件需要的前提条件
命令则是生成文件的命令
Makefile中最常用的变量是 $@ $^ 和 $< ,这些变量能简化Makefile的书写,也使Makefile更强壮。
$@ --- 指代目标文件
$^ --- 指代所有依赖文件
$< --- 指代第一个依赖文件
比如如下代码
main: main.o test1.o test2.o
gcc -o main main.o test1.o test2.o
main.o: main.c test1.h test2.h
gcc -c main.c
test2.o: test2.c test2.h
gcc -c test2.c
test1.o: test1.c test1.h
gcc -c test1.c
就能简写成
main:main.o test1.o test2.o
gcc -o $@ $^
main.o: main.c test1.h test2.h
gcc -c $<
test2.o: test2.c test2.h
gcc -c $<
test1.o: test1.c test1.h
gcc -c $<
Makefile还能继续通过隐藏规则进一步简化,比如:
..c.o:
gcc -c $<
这个规则表示所有的.o文件都依赖与名字相同的.c文件
这样一来,上面的代码就可以简化成
main: main.o test1.o test2.o
gcc -o $@ $^
..c.o:
gcc -c $<
当然,我们也可以自己定义变量,这样有利于代码的移植,也可以非常方便的使用不同的命令参数来控制编译
比如我们可以将编译器作为变量,这样只要改变变量的值,那整个Makefile就可以在不同的环境下进行编译
这样,上面的代码可以写成
CXX = gcc
main:main.o test1.o test2.o
$(CXX) -o $@ $^
..c.o:
$(CXX) -c $<