为什么要使用makefile?
因为在嵌入式linux开发过程中,没有好用的IDE工具,没有好用的图形化的开发工具,与之类别,在windows下,有visual studio,可以在这个工具下,点点鼠标就创建工程,编译程序,这些背后的技术其实和Makefile相近,我们可以使用makefile为我们的工程和程序提供一套编译系统,也可以非常简单的执行某些命令就可以去编译文件,清除文件
Makefile的引入及规则
Makefile的引入及规则
①使用keil,mdk,avr等工具开发程序时,点点鼠标就可以编译,它的内部机制是什么?它是怎么组织管理程序?怎么决定编译哪一个文件
②makefile的语法
③Makefile实例
001_test_app
在该文件下写两个文件a.c b.c
上传到Ubuntu进行编译
gcc -o test a.c b.c (预处理,编译,汇编,连接),对所有的文件进行处理,但是如果只有一个文件有变,应该只编译改变文件,然后重新链接。
然后执行./test
如何判断哪些文件被修改?根据时间,如果a.c生成时间比a.o新,应该重新生成a.o.
makefile的语法规则:
目标文件:依赖文件
tab 命令
当依赖比目标新的时候,执行命令。
写Makefile文件,
test : a.o b.o
gcc -o test a.o b.o
a.o : a.c
gcc -c -o a.o a.c
b.o : b.c
gcc -c -o b.o b.c
写完上传,然后在001_test_app下执行make
makefile语法
a. 通配符
002_syntax
在上面的Makefile文件中,单独编译a.c b.c,当文件较多时,这样操作很麻烦,可以使用通配符
增加一个c.c.
test : a.o b.o c.o
gcc -o test $^ ($^表示所有依赖)
%.o : %.c
gcc -c -o $@ $< ($@表示目标文件) ($<表示第一个依赖)
b.假想目标:.PHONY
在上面的基础上修改Makefile文件,实现清除文件
002_phony
test : a.o b.o c.o
gcc -o test $^
%.o : %.c
gcc -c -o $@ $<
clean:
rm *.o test
.PHONY: clean
上传文件后,执行 make命令,来生成第一个目标文件test,使用make clean来清除所有的文件
使用Makefile时,一般用make [目标],如果没有目标,则默认第一个目标
如果目录里面没有clean文件,这个规则执行的条件成立,make clean就可以清除文件,如果目录里有clean文件,但是clean这里没有依赖,因此无法判断依赖的时间,那么make clean 就无法执行,把目标clean定义为假象目标,就不会判断名为clean的文件是否存在
c.即时变量
makefile 里面有两种变量,即时变量(简单变量),延时变量
A :=xxx #A的值即刻确定,在定义时,就确定
B = xxx #B的值使用到才确定
003_variable
A := abc
B = 123
all :
@echo $(A) (加上@符号,不会看到命令@本身)
@echo $(B)
A := $(C)
B = $(C)
C = abc
all :
@echo $(A)
@echo $(B)
还有 ?= #延时变量,如果是第一次定义才有效 += #附加,即时变量还是延时变量取决于前面的值