浅谈Makefile
Makefile是一种配置文件,类似于shell脚本。一个工程中往往包含很多个文件,使用Makefile能把所有文件(.c&.CPP&.h)编译、联系起来,确定它们的编译顺序,及那些需要重新编译,然后你仅仅需要在shell命令行执行make来实现工程中所有文件的自动化编译
从源代码到可执行文件
- 源代码(.c,.cpp)通过compile生成中间文件(.o)
g++/gcc -c *.c
g++ -c *.cpp
- 然后把全部中间文件链接起来,合成可执行文件。
g++/gcc -o filename *.o
Makefile规则
target … : prerequisites …
command
…
…
target是一个目标文件,可以是中间文件(.o),也可以是可执行文件,还可以是标签。
prerequisites就是生成target需要的文件。
command就是需要执行的shell命令。
target这一个或多个的目标文件依赖于prerequisites中的文件,其生成规则定义在command中。说白一点就是说,prerequisites中如果有一个以上的文件比target文件要新的话,command所定义的命令就会被执行。这就是Makefile的规则。也就是Makefile中最核心的内容。
实例
#obj=main.o my_print.o my_print2.o
#run: $(obj)
# g++ -o run $(obj)
#my_print.o: my_print.c
# g++ -c my_print.c
#my_print2.o: my_print2.c
# g++ -c my_print2.c
#main.o: main.c all.h
# g++ -c main.c
#clean:
# rm run $(obj)
#只要make看到一个[.o]文件,它就会自动的把[.c]文件加在依赖关系中,如
#果make找到一个whatever.o,那么whatever.c,就会是whatever.o的依
#赖文件。并且 cc -c whatever.c 也会被推导出来,下面是简易版
obj=main.o my_print.o my_print2.o
run: $(obj)
g++ -o run $(obj)
main.o:all.h
my_print.o:
my_print2.o:
.PHONY #表示clean是一个伪目标文件
clean:
rm run $(obj)