phthon网站开发,服务器空间租赁,武进网站建设价位,百度做网站为什么上阿里云备案目录
一、make/Makefile的简单使用
二、Makefile 的语法规则
三、实现的原理
3.1 make/Makefile识别文件新旧
3.2 .PHONY修饰的伪目标总是被执行
3.3 make/Makefile是具有依赖性的推导能力的
四、语法技巧
五、注意事项 Linux中自动化构建项目最简单的方式#xff1a;…目录
一、make/Makefile的简单使用
二、Makefile 的语法规则
三、实现的原理
3.1 make/Makefile识别文件新旧
3.2 .PHONY修饰的伪目标总是被执行
3.3 make/Makefile是具有依赖性的推导能力的
四、语法技巧
五、注意事项 Linux中自动化构建项目最简单的方式make/Makefile make是一个命令 Makefile:是一个在当前目录下存在的一个具有特定格式的文本文件。 (Makefile首字母可以小写但建议使用大写) makefile文件中保存了编译器和链接器的参数选项并且描述了所有源文件之间的关系。make程序会读取makefile文件中的数据然后根据规则调用编译器汇编器链接器产生最后的输出。 一、make/Makefile的简单使用
创建Makefile touch Makefile 编写Makefile: vim Makefile 编写要生成的可执行程序mybin和项目清理clean使用make命令生成可执行程序 make 使用make命令进行项目清理 make clean 二、Makefile 的语法规则
Makefile 中包括依赖关系(目标、依赖)和依赖方法(命令)。 下面是 Makefile 中一些要素的基本语法规则 目标指定了要生成的文件或要执行的操作名。 例如上面的mybin就是要生成的目标文件名。 依赖指定了目标所依赖的文件或其他目标。 例如上面的test.c 是目标文件依赖的文件。一个目标文件可以有多个依赖文件用空格分开。 目标和依赖构成了依赖关系。 命令依赖方法包含了生成目标所需的具体操作步骤通常是一条或多条 Shell 命令。 第二行必须以Tab开头不能是空格紧接着是生成目标文件的命令。 例如上面的gcc test.c -o mybin -stdc99 (gcc test.c -o mybin 与gcc -o mybin test.c 相同-o后面跟目标文件名即可) 伪目标伪目标是指在 Makefile 中.PHONY定义的不对应实际文件的目标通常用于执行一些特定的操作比如清理临时文件。 例如上面的clean目标用于执行清理操作删除mybin文件。注make默认执行的是第一行的命令一般把清理工作放在最后面。 注释使用 # 符号来添加注释注释从 # 开始一直到该行的末尾。 变量可以使用变量来存储命令选项、编译器名称等信息然后在规则中引用这些变量。语法格式VAR_NAME value 条件判断可以使用条件判断ifeq、ifdef 等来根据不同的条件执行不同的命令。 函数Makefile 支持一些内置函数可以用于字符串处理、文件查找等操作。 使用make和make clean就可以方便地完成项目自动化构建和清理。
三、实现的原理
3.1 make/Makefile识别文件新旧
make命令不是每次都会重新编译只有更改过的文件才会重新编译。提高编译效率 若源代码没有更改也重新编译那么每次预处理编译汇编链接的时间比较长成本高。 make/Makefile是如何知道文件更改过的 答通过源文件的修改时间和形成的可执行程序(也是文件)的修改时间做对比。 重新编译的本质重新写入一个二进制的可执行文件(bin文件)文件的修改时间会跟着更改。
第一次的时候一定是先有源文件才有bin文件。源文件的修改时间 bin文件的修改时间第二/n次的时候我们对源文件做任何修改的时候,源文件的修改时间 bin文件的修改时间重新编译形成可执行
大部分情况下重新编译都没问题问题的产生不仅仅是修改新文件就能解决的。有些历史问题需要重新清理项目才可以解决。 文件 内容 属性所以文件的ACM时间肯定与内容或属性有关。 Access最近访问时间普通文本文件打开cat、vim或者对目录进入、ls显示等 Modify 对内容修改当文件内容发生变化时修改时间mtime会被更新。 Change对属性修改当文件的权限、所有者、链接数或文件名发生变化时更改时间ctime会被更新。 注 三种时间会出现联动例如对内容修改Access和Change时间也会更改。Access时间不是每次访问时都更改读取查看文件操作最频繁如果每次都改的话比较浪费时间因为文件一般都在磁盘存放更改时间的本质就是访问磁盘。但是访问磁盘的速度比较慢相对cpu而言读取查看文件操作又是很频繁如果每次都更改Access time的话系统效率就会降低很多所以就会隔一段时间更改一次。 具体间隔时间和是否间隔由内核版本决定使用touch命令可以修改ACM时间。-a 选项 修改Access时间但同时也修改了change时间因为access时间也是属性。-m 选项 修改Modify时间但是Change时间也会跟着改。 综上make 是通过对比源文件和bin文件的Modify时间确定文件新旧的。
3.2 .PHONY修饰的伪目标总是被执行
通过时间对比可以做到不让有些代码进行重新编译(不让某些操作进行)。 总是被执行就是不考虑其他任何问题总是执行依赖方法不会被任何情况拦截。 make/makefile不再依靠时间对比了直接执行对应的命令 例如mybin被.PHONY修饰则多次make时都会执行gcc命令把可执行程序重新形成。 3.3 make/Makefile是具有依赖性的推导能力的
上一节讲到gcc编译生成一个可执行程序需要经过预处理、编译、汇编和连接中间会产生.i.o.s文件。但是在上面的操作中都没有生成中间文件。但是我们知道一件事生成bin文件就需要对应的.o文件。
以Makefile的推导过程如下类似一个栈结构 生成了临时文件 code.o code.s code.i
以上写法只是为了了解编译推导的过程实际上不推荐使用。
建议直接用gcc形成可执行 四、语法技巧
Makefile里面的指令执行时会自动回显出来可以在前面加上 符号使其不回显不显示指令信息。可以使用 echo 添加一些输出信息。依赖方法可以不止一个用回车隔开。makefile中用 # 注释makefile中可以编写变量表达式之间不建议带空格 通过 $(变量名) 来引用变量的值。 用途:之后如果想使用g只需要把gcc改成gmybin改成mybin.exe可以用 #^ 符号代替依赖关系中的所有内容# 代替要形成的目标文件 五、注意事项
首次make时make扫描Makefile文件时自顶向下。如果发现第一个目标文件则尝试根据该目标及其依赖关系构建目标文件。默认一次形成一个最终的目标文件伪目标文件没有实际的依赖关系每次都会执行其定义的命令而不是构建文件。Makefile里主要包含了五个东西显式规则、隐晦规则、变量定义、文件指示和注释。 显式规则说明了如何生成一个或多个目标文件。make有自动推导的功能所以隐晦的规则可以让我们比较粗糙地简略地书写makefile比如源文件与目标文件之间的时间关系判断。在makefile中可以定义变量当makefile被执行时其中的变量都会被扩展到相应的引用位置上通常使用 $(var) 表示引用变量。文件指示。在一个makefile中引用另一个makefile类似C语言中的include; .mk 是用来表示 Makefile 文件的扩展名。 include path/to/another_makefile.mktarget: dependencycommand注释makefile中可以使用 # 在行首表示行注释默认的情况下make命令会在当前目录下按顺序找寻文件名为GNUmakefile、makefile、Makefile的文件。