一、为什么需要Makefile?
使用GNU Make工具管理程序是每个Linux工程师必须掌握的技能。Make能够是整个程序的编译、链接只需要一个命令(make)就可以完成。Make的工作主要依赖一个叫为Makefile的文件。Makefile文件描述了整个程序的编译,链接等规则。其中包括:工程中的哪些文件需要编译以及如何编译,如何最后产生我们需要的可执行文件。
二、Makefile构成:
1、规则
Makefile中最重要的组成部分是“规则”
规则:用于说明如何产生目标文件,规则的格式如下:
targets : prerequisites
command
目标 依赖 命令
特别提示:命令需要使用【Tab】键空格。
led.bin : led.o
arm-linux-ld -Tled.lds -o led.elf led.o
2、伪目标
Makefile中把那些只包含命令,没有任何依赖的目标称为“伪目标”(phony targets).
.PHONY : clean
clean:
rm -f hello main.o func
".PHONY"将"clean"目标声明为伪目标
3、最终目标
1>当一个makefile中有多条规则时,如何单独执行某条规则?
2>如果用户没有指定执行某一条规则,make会默认执行makefile中的第一条规则,而这条规则中的目标称之为:最终目标
all : led.o
arm-linux-ld -Tled.lds -o led.elf led.o
arm-linux-objcopy -O binary led.elf led.bin
4、变量
使用变量前:
app1: app1.o func1.o func2.o
`gcc app1.o func1.o func2.o -o app1
app2: app2.o func1.o func2.o
`gcc app2.o func1.o func2.o -o app2
使用变量后:
obj=func1.o func2.o
app1: app1.o $(obj)
gcc app1.o $(obj) -o app1
app2: app2.o $(obj)
gcc app2.o $(obj) -o app2
在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 $^
5、通用规则
当一个makefile中有许多类似的规则时,如何将这些规则合并为一条通用规则?
%.o : %.S
arm-linux-gcc -g -o $@ $< -c
6、使用技巧
1>去回显:
Makefile中"#"字符后的内容被视作注释。
hello: hello.c
@gcc hello.c -o hello
@:取消回显
2>修改makefile名:
make命令默认在当前目录下寻找名字为makefile或Makefile的工程文件,当名字不为这两者之一时,可以使用如下方法指定:
make -f 文件名
阅读(2033) | 评论(0) | 转发(0) |