Linux——Makefile文件
Makefile/makefile
Windows环境下IDE会自动帮你完成makefile文件的编写,Linux上我们需要自己编写。
Makefile
文件,我们可以将其理解为一个工程文件的编译规则,描述了整个工程的编译和链接等规则,它定义了一系列规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作。
----Makefile中可以执行操作系统的命令,一旦写好,只需要一个make命令,整个工程完全自动编译,可以使我们的项目工程的编译变得自动化
,不需要每次都手动输入一堆源文件和参数,极大提高了软件开发的效率
。
make
是一个命令工具,是一个解释Makefile中指令的命令工具。
特点
- Make工程管理器启动后,会根据MakeFile文件中的编译规则命令对源文件进行编译和链接,最终生成可执行文件;
- 每次make会检查每个源文件的修改时间戳(保证OS时间正确),避免多余的工作量;
Makefile文件的基本结构
target : prerequisitecommand
创建每一个目标体时所需要执行的命令(command),此行必须以制表符Tab开头。
对于这三个参数的解释如下:
target:规则的目标,也就是一个目标文件,可以是Object File(中间文件),也可以是可执行文件。还可以是一个标签(Label)。
prerequisite :依赖文件,要生成那个target所需要的文件或是目标;可以是多个,也可以没有。
command :make需要执行的命令。(任意的Shell命令),前面是一个Tab制表符,可以有多条命令,每条命令占一行。多个命令之间需要使用分号隔开
注意:命令中出现的字符‘#’
到行末的内容会被认定为注释,但是当‘#‘’不在此行的行首时,不会被当做注释处理。
makefile文件中,规则的书写顺序是很重要的,makefile中应该有一个最终目标,其他的目标都是被这个目标所连带出来的,要让make知道你的最终目标。makefile中第一条规则中的目标将被确立为最终的目标。如果第一条规则中的目标有很多个,那么,第一个目标会成为最终的目标。make所完成的也就是这个目标
规则中的通配符
*
:: 表示任意一个或多个字符?
:: 表示任意一个字符[...]
:: ex. [abcd] 表示a,b,c,d中任意一个字符, [^abcd]表示除a,b,c,d以外的字符,[0-9]
表示 0~9中任意一个数字~
:: 表示用户的home目录
Makefile文件的变量赋值规则
语法规则为:
变量名称=值列表
变量的名称可以由大小写字母、阿拉伯数字和下划线
构成。等号左右的空白符没有明确的要求,因为在执行 make 的时候多余的空白符会被自动的删除。至于值列表,既可以是零项,又可以是一项或者是多项。
Value_List = 1 2 3
调用变量的时候可以用 (Value_List)或者是{Value_List}来替换,这就是变量的引用。
模式规则
模式规则类似于普通规则。只是在模式规则中,目标名中需要包含有模式字符“%”(一个)
包含有模式字符“%”的目标被用来匹配一个文件名,“%”可以匹配任何非空字符串。
规则的依赖文件中同样可以使用“%”,依赖文件中模式字符“%”的取值情况由目标中的“%”来决定。
例如:对于模式规则“%.o : %.c”,它表示的含义是:所有的.o文件依赖于对应的.c文件。
模式规则中,至少在规则的目标中要包含“%”符号。
%.o : %.c ; <command…>
其含义是,字指出了从所有的.c文件生成相应的.o文件的规则。如果要生成的目标是”a.o b.o”,那么
“%.c”就是”a.c b.c”。
%.o : %.c
$(CC) -c $(CFLAGS) $(CPPFLAGS)$< -o $@
表示把所有的.c文件都编译成.o文件。
其中,“ @ ”表示所有目标的集合,” @”表示所有目标的集合,” @”表示所有目标的集合,”<”表示所有依赖目标的集合(在模式定义规则的情形下)。
自动化变量规则
关于自动化变量可以理解为由 Makefile 自动产生的变量。 在模式规则中,规则的目标和依赖的文件名代表了一类的文件。
在模式中表示文件,就需要使用“自动化变量
”,自动化变量的取值根据执行的规则决定,取决于执行规则的目标文件和依赖文件。
make会自动识别命令中的自动化变量,并自动实现自动化变量中的值的替换。
环境变量——指定搜索路径
VPATH=路径(多个路径之间用‘ :’分隔)
VPATH是环境变量,make中的一种特殊变量,使用时需要制定文件的路径;
cc=gcc指定编译工具
VPATH和vpath的区别
vpath是关键字,按照模式搜索,也可以说成是选择搜索,搜索的时候不仅需要加上文件的路径,还需要加上相应的限制条件。
无论你定义了多少路径,make 执行的时候会先搜索当前路径下的文件,当前目录下没有我们要找的文件,才去 VPATH 的路径中去寻找。 如果当前目录下有我们要使用的文件,那么 make 就会使用我们当前目录下的文件。
深入理解隐式规则
当make发现目标的依赖不存在时, ->尝试通过依赖名逐一查找隐式规则,并且通过依赖名推到可能需要的源文件
1 app.out : main.o func.o
2 $(CC) -o $@ $^
1.发现依赖目标不存在
2.查找隐式规则,并自动导出func.c和main.c
3.根据文件后缀自动推到编译命令->CC -c -o func.o func.c
隐式规则的副作用
编译行为难以控制,大量使用隐式规则可能产生意想不到的编译行为
编译效率低下:make从隐式规则和自定义规则中选择最终使用的规则
当以来目标不存在时,make会极力组合各种隐式规则对目标进行创建,进而产生意料之外的编译行为
例:需要名为N.o的文件 : N.y->N.c->N.o
问题: make提供了多少隐式规则?如何查看隐式规则?
make -p
make提供了大概上千种隐式规则,所以我们并不知道make会如何组合这些隐式规则,无法判断编译行为.
最后让我们看看make是怎么工作的??
今天就这么多!
Linux——Makefile文件相关推荐
- linux makefile文件怎么生成,Makefile文件生成
所必须的软件:autoconf (generate configuration script [configuration]) automake( aclocal:automatically gene ...
- Linux编程——入门级Makefile文件编写
前言 1.在Linux开发环境中,编写Makefile文件是一个必须的技能,虽然现在有好多IDE可以自动生成所需要的Makefile文件,但有时能看懂Makefile文件也是更好的了解项目的编译过程. ...
- 【Linux】Makefile文件
Makefile文件 1. Makefile定义 一个工程中的源文件不计其数,其按类型.功能.模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译 ...
- Linux平台Makefile文件的编写基础篇和GCC参数详解
问:gcc中的-I.是什么意思....看到了有的是gcc -I. -I/usr/xxxxx..那个-I.是什么意思呢 最佳答案 答:-Ixxx 的意思是除了默认的头文件搜索路径(比如/usr/incl ...
- 【Linux】makefile文件基础
linux系统上管理工程使用makefile文件,其中写了工程编译的规则以及编译顺序.只需要每次执行make命令,make自动在当前目录下搜索Makefile或makefile,按照makefile中 ...
- 分析Linux 0.11中的kernel部分的makefile文件
# # 在UltraEdit下注释 # # # # if you want the ram-disk device, define this to be the # size in blocks. ...
- Linux内核Makefile文件
Linux内核Makefile文件(翻译自内 核手册) 转载自:http://blog.chinaunix.net/uid-21651676-id-60377.html Linux 内核Makefil ...
- 多线程编译与运行linux,Linux系统下多线程程序编译makefile文件
在Linux下,编译一个多线程的程序命令为: gcc -lpthread -o file file.c 在Linux下,用交叉编译器编译一个在uclinux下运行的多线程程序,makefile文件如下 ...
- Linux作业 使用make命令和分析makefile文件
使用make命令和分析makefile文件 diction是一个经典的Unix小工具,用来检测使用不当的英文短语. 请前往 http://www.gnu.org/software/dictio ...
最新文章
- Postgres和Oracle与Hibernate的兼容性
- html鼠标滚动效果代码,JS+CSS实现大气清新的滑动菜单效果代码
- mock.js 在html中使用demo示例代码
- 在二维数组中寻找最小鞍点1181(该行最大值,该列最小值)(2种思路)
- 卷积神经网络发展简史
- 小米手机电池恢复代码_小米手机隐藏技巧,你真的会用吗?别再浪费如此强大的功能了...
- Linux复制文件到某路径并重命名
- 赚一辈子的钱,还是一辈子赚钱? 掌握下一个财富分配周期的法则
- Gerrit用户登录显示Forbidden
- 最终作业 - 软件工程实践总结
- 计算机组成原理——第4章 指令系统
- 中国地区“MMM dd, yyyy HH:mm:ss a“的时间格式问题
- 2022-6-4 小明爱上课,切木头,最多分成多少块,躲猫猫,争渡
- matlab diag函数生成矩阵,Matlab矩阵运算函数-blkdiag函数
- Android Wi-Fi 修改国家码(QCOM平台)
- 单片机怎么学?有必要参加单片机培训班吗?
- ubuntu下安装Qt操作流程
- react实现简易画板程序
- 简历-lol学习性项目
- Ajax同步请求出现浏览器页面假死,阻塞UI线程之解决方案