使用Gnu make工具来管理程序是每个Linux工程师必须掌握的技能。Make能够是整个程序的编译、链接只需要一个命令(make)就可以完成。Make的工作主要依赖一个称为Makefile的文件。文件描述了整个程序的编译,链接等规则。包括:工程中哪些源文件需要编译以及如何编译,如何最后产生我们想要的可执行文件。
makefile主要由规则和变量两部分构成。
规则:
一般规则如下:
targets : prerequisites
command
目标:依赖
命令
备注:命令需要使用【TAB】键空格
例如:
hello:hello.c
gcc hello.c -o hello
其中Makefile把那些只包含命令,没有任何依赖的目标称为伪目标(phony targets)。
.PHONY :clean
clean:
rm -f hello
注:".PHONY"将clean目标声明为伪目标。
如果用户没有定执行某一条规则,make会默认执行makefile中的第1条规则,而这条规则中的目标称之为:最终目标。
例如:
hello:hello.c
gcc hello.c -o hello
clean:
rm -f hello
如果只执行make,默认执行第一条规则。如果执行make clean则执行第二条clean规则。当然也可以这样子执行:make clean hello.执行顺序是clean规则,hello规则。
通用规则:
如果makefile中有许多类似的规则时,可以将这些规则合并为一条通用规则。
例如:
all:led.bin
led.bin: led.o
arm-linux-ld -Tled.lds -o led.elf led.o
arm-linux-objcopy -O binary led.elf led.bin
led.o : led.S
arm-linux-gcc -g -o [email protected] -c $^
main.o : main.S
arm-linux-gcc -g -o [email protected] -c $^
func.o : func.S
arm-linux-gcc -g -o [email protected] -c $^
合并后:
all:led.bin
led.bin: led.o
arm-linux-ld -Tled.lds -o led.elf led.o
arm-linux-objcopy -O binary led.elf led.bin
%.o : %.S
arm-linux-gcc -g -o [email protected] -c $^
变量:
例如:
obj = hello.c
hello:${obj}
gcc ${obj} -o hello
在makefile中除了用户可以自定义变量外,还可以使用系统已经定义好的默认变量。
如:
$^:代表所有依赖文件
[email protected]:代表目标
$<:代表第一个依赖文件
例如:
使用前:
led.o : led.S
arm-linux-gcc -g –o led.o -c led.S
使用后:
led.o : led.S
arm-linux-gcc -g –o [email protected] -c $^
附加说明:
Makefile中“#”字符后的内容被视作注释。
hello: hello.c
@gcc hello.c –o hello
@:可以取消回显
那么什么是回显呢?演示一下:
makefile内容(未去回显):
hello:hello.c
gcc hello.c -o hello
clean:
rm -f hello
运行如下:
运行过程中出现的命令行即为回显。
makefile内容(去回显):
hello:hello.c
@gcc hello.c -o hello
clean:
rm -f hello
运行如下: