Makefile/makefile

Windows环境下IDE会自动帮你完成makefile文件的编写,Linux上我们需要自己编写。

Makefile文件,我们可以将其理解为一个工程文件的编译规则,描述了整个工程的编译和链接等规则,它定义了一系列规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作。
----Makefile中可以执行操作系统的命令,一旦写好,只需要一个make命令,整个工程完全自动编译,可以使我们的项目工程的编译变得自动化,不需要每次都手动输入一堆源文件和参数,极大提高了软件开发的效率
make是一个命令工具,是一个解释Makefile中指令的命令工具。
特点

  1. Make工程管理器启动后,会根据MakeFile文件中的编译规则命令对源文件进行编译和链接,最终生成可执行文件;
  2. 每次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文件相关推荐

  1. linux makefile文件怎么生成,Makefile文件生成

    所必须的软件:autoconf (generate configuration script [configuration]) automake( aclocal:automatically gene ...

  2. Linux编程——入门级Makefile文件编写

    前言 1.在Linux开发环境中,编写Makefile文件是一个必须的技能,虽然现在有好多IDE可以自动生成所需要的Makefile文件,但有时能看懂Makefile文件也是更好的了解项目的编译过程. ...

  3. 【Linux】Makefile文件

    Makefile文件 1. Makefile定义 一个工程中的源文件不计其数,其按类型.功能.模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译 ...

  4. Linux平台Makefile文件的编写基础篇和GCC参数详解

    问:gcc中的-I.是什么意思....看到了有的是gcc -I. -I/usr/xxxxx..那个-I.是什么意思呢 最佳答案 答:-Ixxx 的意思是除了默认的头文件搜索路径(比如/usr/incl ...

  5. 【Linux】makefile文件基础

    linux系统上管理工程使用makefile文件,其中写了工程编译的规则以及编译顺序.只需要每次执行make命令,make自动在当前目录下搜索Makefile或makefile,按照makefile中 ...

  6. 分析Linux 0.11中的kernel部分的makefile文件

    # # 在UltraEdit下注释 #  # # # if you want the ram-disk device, define this to be the # size in blocks. ...

  7. Linux内核Makefile文件

    Linux内核Makefile文件(翻译自内 核手册) 转载自:http://blog.chinaunix.net/uid-21651676-id-60377.html Linux 内核Makefil ...

  8. 多线程编译与运行linux,Linux系统下多线程程序编译makefile文件

    在Linux下,编译一个多线程的程序命令为: gcc -lpthread -o file file.c 在Linux下,用交叉编译器编译一个在uclinux下运行的多线程程序,makefile文件如下 ...

  9. Linux作业 使用make命令和分析makefile文件

    使用make命令和分析makefile文件   diction是一个经典的Unix小工具,用来检测使用不当的英文短语.   请前往 http://www.gnu.org/software/dictio ...

最新文章

  1. Postgres和Oracle与Hibernate的兼容性
  2. html鼠标滚动效果代码,JS+CSS实现大气清新的滑动菜单效果代码
  3. mock.js 在html中使用demo示例代码
  4. 在二维数组中寻找最小鞍点1181(该行最大值,该列最小值)(2种思路)
  5. 卷积神经网络发展简史
  6. 小米手机电池恢复代码_小米手机隐藏技巧,你真的会用吗?别再浪费如此强大的功能了...
  7. Linux复制文件到某路径并重命名
  8. 赚一辈子的钱,还是一辈子赚钱? 掌握下一个财富分配周期的法则
  9. Gerrit用户登录显示Forbidden
  10. 最终作业 - 软件工程实践总结
  11. 计算机组成原理——第4章 指令系统
  12. 中国地区“MMM dd, yyyy HH:mm:ss a“的时间格式问题
  13. 2022-6-4 小明爱上课,切木头,最多分成多少块,躲猫猫,争渡
  14. matlab diag函数生成矩阵,Matlab矩阵运算函数-blkdiag函数
  15. Android Wi-Fi 修改国家码(QCOM平台)
  16. 单片机怎么学?有必要参加单片机培训班吗?
  17. ubuntu下安装Qt操作流程
  18. react实现简易画板程序
  19. 简历-lol学习性项目
  20. Ajax同步请求出现浏览器页面假死,阻塞UI线程之解决方案

热门文章

  1. 会声会影无法导入.ts文件编辑解决办法
  2. 开源运行时社区 - 核心概念说明
  3. 使用 redis 连接指定端口的 redis 数据库
  4. 易经的奥秘》笔记--台湾师范大学曾仕强
  5. 快速扫盲 | 霍尔传感器的工作原理
  6. 长程蓝牙温湿度及光照度传感器 , 带四通道开关及指示灯(集成太阳能微能量采集功能)
  7. 编写操作norflash的裸机程序
  8. C语言打印三角形图案
  9. 获取windows系统时间
  10. 【java】eclipse