Linux学习——Makefile工程管理

使用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 $@ -c $^

main.o : main.S
arm-linux-gcc -g -o $@ -c $^ 

func.o : func.S
arm-linux-gcc -g -o $@ -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 $@ -c $^


变量:

例如:

obj = hello.c

hello:${obj}

gcc ${obj} -o hello

在makefile中除了用户可以自定义变量外,还可以使用系统已经定义好的默认变量。

如:

$^:代表所有依赖文件

$@:代表目标

$<:代表第一个依赖文件

例如:

使用前:
led.o : led.S
arm-linux-gcc -g –o led.o -c led.S
使用后:
led.o : led.S
arm-linux-gcc -g –o $@ -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

运行如下:

技术分享


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。