Makefile文件的组成及引用其它的Makefile和make的工作方式
makefile的介绍可以参考《makefile介绍及示例》
Makefile文件由五部分组成:
- 显式规则:显式指出生成的目标文件、依赖的文件、生成命令。
- 隐式规则:利用make的自动推导功能,可以简化规则的编写,参考《make命令的自动推导》。
- 变量定义:定义一系列的变量,可以在Makefile文件其他地方引用。
- 文件指示:包括三部分,(1)一个是在一个 Makefile 中引用另一个 Makefile;(2)另一个是根据某些情况指定 Makefile 中的有效部分;(3)还有就是定义一个多行的命令。
- 注释:Makefile 中只有行注释,以 # 字符开头,如果文件中要用到#,必须进行转义:\# 。
注意:
在 Makefile 中的命令,必须要以 Tab 键开始。
引用其它的 Makefile
在Makefile 使用 include 关键字可以把其他的 Makefile 文件包含进来,被包含的文件内容会插入到包含位置。include 的语法是:
include <filename>
- 1
filename 可以包含路径和通配符。
注意:
在 include 前面不能用Tab 键开始。
make 命令开始时,会寻找 include 包含的 Makefile文件,并将其内容插入到当前的位置。如果文件都没有指定绝对路径或是相对路径的话,make 会先在当前目录下寻找。如果运行 make 时,指定 -I 或 --include-dir 参数,make 将在参数所指定的目录下找。如果最后还是没有找到文件的话,make 会生成一条警告信息,然后继续载入其它的文件,一旦完成 makefile 的读取,make 会再重试寻找这些没有找到的文件或者是不能读取的文件,如果还是不行,make 才会出现一条致命信息。
如果你想让 make 不理那些无法读取的文件,而继续执行,可以在 include 前加一个减号“-”,如:
-include <filename>
- 1
未使用include之前:
在编译子目录下的源文件时,需要指的路径,否则会在当前目录下找。
OBJECTS = main.o hello.o car.o ./module/radio.o
app:$(OBJECTS) gcc -o app $(OBJECTS)
$(OBJECTS):hello.h
main.o car.o:car.h
main.o:./module/radio.h
radio.o:./module/radio.h .PHONY:clean
clean: -rm app $(OBJECTS)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
使用include之后:
把radio.o:./module/radio.h的规则放到子目录makefile文件./module/module.mk中。
OBJECTS = main.o hello.o car.o ./module/radio.o
app:$(OBJECTS) gcc -o app $(OBJECTS)
$(OBJECTS):hello.h
main.o car.o:car.h
main.o:./module/radio.h
-include ./module/module.mk
.PHONY:clean
clean: -rm app $(OBJECTS)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
./module/module.mk:
radio.o:radio.h
- 1
再谈make 的工作方式
GNU 的 make 工作时的执行步骤如下:
- 读入所有的 Makefile。
- 读入被 include 的其它 Makefile。
- 初始化文件中的变量。
- 推导隐式规则,并分析所有规则。
- 为所有的目标文件创建依赖关系链。
- 根据依赖关系,决定哪些目标要重新生成。
- 执行生成命令。
更多参考请看: 《make命令的工作原理》
谢谢阅读
文章来源: blog.csdn.net,作者:WongKyunban,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/weixin_40763897/article/details/103118448
- 点赞
- 收藏
- 关注作者
评论(0)