【Linux】Make/Makefile

ops/2024/11/28 13:26:38/

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

这个3/4行的语法和1/2行是一样的。也是依赖关系和依赖方法。

在这里插入图片描述

make命令扫描makefile文件时,从上向下扫描,默认形成一个目标文件。

指定make clean的时候才回去执行对应的清除。

为什么要给我们的clean.PHONY:clean声明它是伪目标呢?

PHONY类似一种建议性的关键字。

伪目标,表示对应的依赖方法和依赖关系总是被执行。

什么叫不被执行?

我们上面的这组可执行程序没有被修饰,所以我们如果make完又make,是不会执行的。但如果用为目标修饰了,就会发现也可以执行。

在这里插入图片描述

所以我们一般可执行程序不用伪目标修饰,因为如果代码没有更新,没有必要再次编译。

默认老代码不作重新编译。

make怎么知道bin和.c的新旧?

在这里插入图片描述

Linux下每一个文件有三个相关时间,分别是Access/Modify/Change

文件=内容+属性

cat打印内容,ls打印属性

如果我们只改文件内容,那么Modify时间被修改。

如果我们只改文件属性,那么Change时间被修改。

如果不修改,单纯查看,Access时间被更新。

在这里插入图片描述

可以看到,这样我们的Modfiy时间就被改了。

而且文件属性页同步变化了,所以时间也改了:

在这里插入图片描述

大小和时间本就是文件的属性,所以基本都会同时修改。

在这里插入图片描述

更改这个权限,我们就是只改属性。

如果过于高频因为查看就更新时间,会有很多隐性的成本。所以linux现在查看上若干次才会更新一次Access时间,具体多少次看具体系统。

我们知道,myproc.c的Modify时间应当是要比myroc早的。所以make可以以此为依据判断myproc.c是否被修改过了。

我们曾经说过,touch可以用来改文件时间:

在这里插入图片描述

比如带上-a,就可以只改Access时间。

如果什么选项都不带,就会把ACM三个时间全部更新。

所以通过touch更改时间,也能使我们重复使用make。

在这里插入图片描述

所以PHONY的作用就是修饰后总是被执行,如果我们用其修饰第一组的代码,我们就可以重复使用make。

在makefile中注释代码我们使用#来注释。

在这里插入图片描述

在这里插入图片描述

makefile会在自己内部维护一个类似栈结构的东西。

makefile推导规则

在这里插入图片描述

从上往下扫描,从下往上执行。

当我们从上往下扫描,一条找不到时就入栈。所以就保证了我们最后找到myproc.c时,从下往上的执行顺序。


当然我们一般不会这么去写整个过程,自己增加难度。

makefile也允许我们去定义变量。所以我们写makefile一般喜欢这样写:

在这里插入图片描述

在这里插入图片描述

如果改写成这样:

在这里插入图片描述

就不会回显命令。
在这里插入图片描述

在这里插入图片描述

这样,BIN是我们的目标文件,CC是编译器,SRC是源文件,FLAGS是方法。我们将这组变量打印。

在这里插入图片描述

$(BIN)就是取它的内容。

所以我们全以变量的形式呈现了。这就是一个基于变量版本的makefile了。

有点像宏。
在这里插入图片描述

所以我们也能猜出,这样做的好处也就是替换具体的文件时不用改后面的代码了,只要在变量处稍作修改。

在这里插入图片描述

其实,还可以写得更加优雅:

在这里插入图片描述

$@代表的是目标文件,$^代表的是依赖的众多文件列表。

我们的依赖方法来源不止一行。

我们可以把默认的显示信息用@关闭,然后写自己的信息:

在这里插入图片描述

在这里插入图片描述

但我们发现还是将echo回显了,于是我们继续优化:

在这里插入图片描述


多文件呢?

而且,我们并不喜欢直接从.c到可执行文件,而是喜欢先从.c到.o,原因以前说过,为了方便去链接C语言库等,所以我们要改写。

在这里插入图片描述

LFLAGS的L代表link。OBJ代表.o文件。

.o文件从哪来的?所以我们要再写一组依赖关系和方法。但是一般我们的.c文件和以此生成的.o文件不止一个,为了简写,我们使用%.o:%.c这样来写我们的依赖关系。%就像makefile模式下的通配符;在依赖关系中我们也简写为:$(CC) $(FLAGES) $<,也是gcc -c $<,这里<用来简写所有的.c文件。

在这里插入图片描述

我们知道,gcc -c myproc.c -o myproc.o可以帮我们从.c文件编译到.o文件。

然后,gcc -c myproc.c则可以帮我们直接编译出同名.o文件。

这也就是为什么上面我们写成$(CC) $(FLAGS) $<

在这里插入图片描述

优化:

在这里插入图片描述

这个地方,我们可以SRC=$(shell ls *.c)执行ls *.c的命令,然后把对应所有的源文件放在SRC中。就不用我们一个一个手写要的源文件了。

第二种做法:

makefile天生自带类似函数的东西,可以支持我们这样写:SRC=$(wildcard *.c)

也是类似通配符。

在这里插入图片描述

所以我们的OBJ同样也需要这样能够使用类似通配符的效果,来避免一个一个手写。

OBJ=$(SRC:.c=.o)

这就是最终的makefile。

我们这样来创建100个文件:

在这里插入图片描述

不用改刚才的makefile文件了,可以直接这样使用make和make clean:

在这里插入图片描述

在这里插入图片描述

Makefile还有其他语法,日后可以再学。


http://www.ppmy.cn/ops/137367.html

相关文章

门控循环单元(GRU)与时间序列预测应用

一、GRU简介 门控循环单元&#xff08;Gated Recurrent Unit&#xff0c;简称GRU&#xff09;是一种简化版的LSTM&#xff08;长短期记忆网络&#xff09;&#xff0c;专门用于解决长序列中的梯度消失问题。与LSTM相比&#xff0c;GRU具有更简单的结构和较少的参数&#xff0c…

cs144(一)

cs144(一) 1、osi 当应用程序有数据要发送时&#xff0c;应用层将数据交给传输层&#xff0c; 传输层负责将数据可靠或不可靠地传送到另外一端&#xff0c;传输层通过将数据交给网络层来发送数据 网络层负责将数据分成数据包&#xff0c;每个数据包都有正确的目的地址 最后…

Github 2024-11-27 C开源项目日报 Top9

根据Github Trendings的统计,今日(2024-11-27统计)共有9个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量C项目9C++项目2Java项目1显示和控制你的 Android 设备 创建周期:2416 天开发语言:C, Java协议类型:Apache License 2.0Star数量:105222 个Fo…

pycharm报错没有名称为 ‘pytorch‘ 的模块( No module named ‘pytorch‘)

目录 首先&#xff1a;请检查是否下载pytorch和相关的包 错误原因一&#xff1a;没下载pytorch和相关的包 错误原因二、已下载pytorch和相关的包&#xff0c;但是pycharm还是报错 首先&#xff1a;请检查是否下载pytorch和相关的包 解决方法&#xff1a; 我使用的是虚拟环境…

11.25c++继承、多态

练习&#xff1a; 编写一个 武器类 class Weapon{int atk; }编写3个武器派生类&#xff1a;短剑&#xff0c;斧头&#xff0c;长剑 class knife{int spd; }class axe{int hp; }class sword{int def; }编写一个英雄类 class Hero{int atk;int def;int spd;int hp; public:所有的…

【closerAI ComfyUI】物体迁移术,flux三重控制万物一致性生图,赋能AI摄影电商摄影、模特换装、产品展示实用性强

添加图片注释,不超过 140 字(可选) 更多AI前沿科技资讯,请关注我们: 添加图片注释,不超过 140 字(可选) closerAIGCcloserAI,一个深入探索前沿人工智能与AIGC领域的资讯平台,我们旨在让AIGC渗入我们的工作与生活中,让我们一起探索AIGC的无限可能性!closerAI-一个…

DRM(数字权限管理技术)防截屏录屏----ffmpeg安装

提示&#xff1a;ffmpeg安装 文章目录 [TOC](文章目录) 前言一、下载二、配置环境变量三、运行ffmpeg四、文档总结 前言 FFmpeg是一套可以用来记录、转换数字音频、视频&#xff0c;并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的…

sklearn.ensemble

今天了解到ensemble&#xff0c;这是一个集成方法&#xff0c;通过组合多个单一模型来构建更强大的预测模型的技术。核心思想是“集体智慧”&#xff0c;即多个模型的组合通常比单个模型的性能更优。 两个著名的方法就是梯度提升树gradient-boosted trees和随机森林random fo…