我们已经准备好了,你呢?

2026我们与您携手共赢,为您的企业形象保驾护航!

【【小平頭】Linux下文件的的规则格式与变量

里面是由一系列的规则组成的,这些规则格式如下:

目标…... : 依赖文件集合……命令 1命令 2…...

比如下面这条规则:

主程序文件与输入文件编译链接,生成最终的可执行程序,具体命令如下,编译主程序对象文件,同时处理输入文件对象文件,并链接计算相关对象文件,最终产物命名为主程序名,所有对象文件均参与编译链接过程

本条款旨在规范操作流程,main.o、input.o 和 calcu.o 是构建 main 所需的必要文件,若需对 main 进行更新,就必须先将其所有依赖文件进行相应调整,只要依赖文件中存在任何改动,目标文件也必须同步更新,所谓“更新”即是指执行规则中列出的指令步骤。

指令清单里的每项指令必须以制表键开头,禁止使用空格,指令清单里的每项指令必须以制表键开头,禁止使用空格,指令清单里的每项指令必须以制表键开头,禁止使用空格!

make指令针对每条以制表符开头的指令行,都会启动一个Shell进程来执行它。

了解了 的基本运行规则以后我们再来分析一下 ,代码如下:

主程序文件由多个目标文件组合而成,其中包括主程序文件,输入文件处理文件和计算文件,编译链接生成可执行文件,目标文件由对应的源文件编译生成,输入文件处理文件和计算文件分别由它们的源文件编译生成,编译过程中使用gcc命令,编译完成后删除所有目标文件,最后删除生成的可执行文件

这段程序里包含五项规定,第一项位于第一行到第二行,第二项在第三行到第四行,第三项在第五行到第六行,第四项在第七行到第八行,第五项在第十行到第十二行,当执行make指令处理这些内容时,其具体操作流程如下:

首要调整第一条规范中的主项,该规范的目标将转为标准任务,一旦标准任务得到变更,就表明已经实现了全部流程,整个流程的最终目的就是为了达成这一任务。初次编译时,main尚未生成,所以第一条指令会被启动,该指令需要用到main.o、input.o和calcu.o这三个目标文件,然而这些文件目前都缺失,因此必须先创建它们。make程序会寻找以这三个文件为目标的构建步骤并开始执行。以 main.o 为例,可以看出更新这个文件的是第二条规则,所以会应用第二条规则,该规则中的指令是“gcc –c main.c”,这条指令应该很熟悉,它的作用是不进行链接,仅编译 main.c,从而生成 main.o,另外两个 .o 文件也采用同样的处理方式。末条规则要求整洁,它不涉及文件关联,故会认定所有文件均为最新版本,因此相关指令不会启动,若需进行清理操作,可直接输入“make clean”指令,该指令运行后会移除当前文件夹内所有以.o结尾的文件及main文件,这项操作旨在清除工程残留,执行“make clean”的过程如图所示:

make clean执行过程

根据图像可知,一旦运行“make clean”指令,先前编译生成的.o文件以及main可执行程序均被清除,从而实现了项目清理操作。下面将归纳Make的运行流程:

make指令会在本目录中搜寻以该名称命名的文件,该名称并非唯一限定条件。

一旦寻获该文档,便会遵循所定规范,开展编译操作,进而得出最终产物。

一旦确认目标文档缺失,或者目标所需依据的文件更新时间晚于目标文件,便会执行后续指令以刷新目标。

make 的运作方式是这样的,它工具会逐步探寻关联性,然后运行对应指令。最终目的是制作出可执行程序。这种做法的优势在于实现“自动构建”,文件一旦设定妥当,后续只需下达 make 指令,整个项目的构建就能顺利完成,显著提升了工作效率。烹饪与举办宴会有相似之处,二者都以呈现丰盛场面为宗旨,它们的不同之处,具体表现在下方的对比图中。

make 和做菜对比

概括来说,中规则说明特定情形下选用何种指令来生成一个指定文件,该文件即为规则的产物,为形成该产物所需的其他文件称作其前提条件,规则的指令用于形成或更新产物。

其余规则的排列次序在 中并不重要,只有“最终目的”这一条规则例外,所谓“最终目的”就是指在执行 make 命令时若未明确指定目标,make 将自动选取的那个目标,它就是 文件里第一条规则所对应的目标,倘若 文件的第一条规则包含多个目标,那么这些目标中排在首位的那一个目标,就会被 make 确定为“最终目的”。

跟 C 语言一样 也支持变量的,先看一下前面的例子:

编译 main.o 和 input.o 以及 calcu.o 文件, 生成可执行程序 main

这些文件包括 main.o、input.o 以及其他以.o结尾的文件,在输入时被重复填写了两次,考虑到项目规模较小,若规模扩大,这种重复录入会耗费大量时间,且容易出错,因此引入了变量功能,其特点在于所有变量均为字符串类型,不同于C语言中具备 int、char 等多种数据类型如同 C 语言里的宏定义,通过变量对前述代码进行更改,调整后的形态展示如下:

赋值给变量名为使用等号 main.o 和 input.o 以及 calcu.omain 的时候采用括号括起来内容作为参数 gcc 命令生成 main 可执行文件

我们考察一下前面展示的代码,第一行是注释,里面可以记录说明文字,注释必须以符号“#”开头,不能使用 C 语言中的“//”或者“/**/”这些方式。第二行我们创建了一个变量,并且向这个变量赋予了一个内容,这个内容是文本“main.o input.o calcu.o”。第三行和第四行都应用了这个变量。

变量取用方式为“$(变量名)”,例如本例中的“$()”即为调用变量。在编写代码时,定义变量需借助“=”完成赋值。除了此符号,还存在另外两种赋值符,分别是“:=”与“?=”,接下来将阐述这三种赋值符的不同之处。

1、赋值符“=”

赋值操作时,不必依赖先前设定的数值,也可以采用后续指定的数值,例如以下代码段:

名字是zzk, 当前名字是zzk, 名字改成作中开, 显示: 回显当前名字是作中开

我们考察一下这段程序,第一行设立了一个名为name的标识符,其内容为“zzk”,第二行又创建了一个标识符,其内容指向name,依照C语言的知识,此时内容应为“zzk”,第三行将name的内容清空,第五六行是打印标识符的内容。输出字符序列时应用“echo”,这与 C 语言中的用法相似,第 6 行的“echo”前附加了“@”字符,此举是为了防止 Make 运行时自动显示命令执行细节,若命令前加“@”,执行过程便不会展示出来,读者可尝试对比有无“@”的差异。使用命令“make print”来执行上述代码,结果如图:

make执行结果

图中显示的内容并非“zzk”,而是空字符串,这个空字符串就是变量“name”最近一次被赋予的值,这就是等号运作的奇妙之处!利用另一个变量,能够把变量的实际内容放到后面去设定,也就是说,变量的实际内容要看它所关联的变量最后一次有效的值。

2、赋值符“:=”

先在先前代码里验证赋值操作符“:=”,接着把第 2 行里面原本的等号换成“:=”,改好之后的代码是

变量名设定为zzk, 将zzk追加到变量名之后, 变量名变为zzk, 显示变量内容, 使用echo命令, 输出变量zzk的值

修改完成以后重新执行一下 ,结果如图所示:

make执行结果

图中表明,当前变量是 zzk,并非其他值。原因是,使用“:=”赋值时,它不会引用后面定义的变量,仅能应用先前已存在的变量。这正是“=”与“:=”之间的差异所在。

3、赋值符“?=”

“?=”是一个很有用的赋值符,比如下面这行代码:

 curname ?= zuozhongkai 

这段代码的作用在于,当某个变量此前未曾被设定过值时,它会被视为空字符串,而如果该变量之前已经设定过值,那么系统就会采用先前设定的那个值。

4、变量追加“ =”

在处理字符串时,我们常常需要向先前设定好的变量中追加文本内容,这种情况下就必须借助“ =”这个符号,例如在以下代码片段中:

= main.o .o = calcu.o

最初那个变量里面存着“main.o input.o”,后来又往里面加了一个“calcu.o”,这样一来,变量里面就变成了“main.o input.o calcu.o”,这就是给变量增加内容的过程。

二维码
扫一扫在手机端查看

本文链接:https://by928.com/11987.html     转载请注明出处和本文链接!请遵守 《网站协议》
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。

项目经理在线

我们已经准备好了,你呢?

2020我们与您携手共赢,为您的企业形象保驾护航!

在线客服
联系方式

热线电话

13761152229

上班时间

周一到周五

公司电话

二维码
微信
线