之前介绍过gcc了,这篇文章主要是在gcc之后为了方便我们对于对文件的编译!
本章分为两个部分: Makefile基本写法 Makefile变量替换写法
废话不多写,直接开干!
Makefile基本写法:
本工程中包括以下文件:(程序内容参原子哥Makefile章节!)
由之前的gcc可知,我们可以直接编译,但是麻烦,所以我们现在对Makefike文件进行书写(名字要Makefile!),内容如下:
ljs: main.o input.o calcu.o
gcc -o ljs main.o input.o calcu.o
main.o: main.c
gcc -c main.c
input.o: input.c
gcc -c input.c
calcu.o: calcu.c
gcc -c calcu.c
clean:
rm *.o
rm ljs
代码分析:执行下面make
可执行文件ljs依赖于这三个.o文件,然后对这三个.o文件进行编译
main.o依赖于main.c。然后对main.c进行编译
代码分析:执行下面make clean
通过以上Makefile设置,那么我们在改动其中一个程序后,系统只会编译被改变的,没有修改的则不会变动,结果如下:
总结:这种写法容易理解,但是比较麻烦,下面介绍的变量替换则会更简单!
Makefile变量替换 写法:
程序分析:设置字符串main.o input.o calcu.o并使其赋值给objects
$是表示变量的前缀,也就是ljs依赖于变量objects
%.c表示所有.c文件
其他内容一样
对文件进行make和make clean可以得到一样的效果。
Makefile中 = 的使用
1.“=”
1 name = ljs
2 curname = $(name)
3 name = liujiasen
此时curname = liujiasen,采取了第二次赋值。因为 = 赋值采用后面定义
2.“:=”
1 name = ljs
2 curname := $(name)
3 name = liujiasen
此时curname =ljs,采取了第一次赋值。因为 := 赋值采用前面定义
3.”?=“
1 name = ljs
2 curname ?= liujiasen
3 name = liujiasen
此时curname =liujiasen,采取了第一次赋值。因为 ?= 赋值采用如果前面没赋值就用当前赋值
伪目标
为了防止Makefile中的clean和外部存在一个clean文件同名而不执行Makefile中的clean
8 .PHONY:clean
9 clean:
10 rm *.o