【Linux】Makefile文件

article/2025/9/26 21:19:01

1.Makefile的作用

Makefile文件定义了一系列的规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,可以实现自动化编译,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。

2. Makefile文件命名和规则

命名为makefile或者Makefile。规则为:

目标....:依赖...命令(Shell命令)  //(前面有个缩进)...

目标:最终要生产的文件
依赖:生产目标所需要的文件
命令:通过执行命令对依赖操作生成目标(前面必须Tab缩进)

3.自己制作Makefile

//fun1.c
void fun1(void) {printf("this is fun1!\n");
}//fun2.c
void fun2(void) {printf("this is fun2!\n");
}//head.h
#include<stdio.h>
void fun1(void);
void fun2(void);//test.c
#include<stdio.h>
#include "head.h"//main.c
int main(){//testfun1();fun2();fun1();return 0;
}

在这里插入图片描述
存在这样四个文件, main.c函数里面调用了head.h的两个函数。

vim makefile

创建makefile文件,输入相关编译命令。

app:fun1.c fun2.c main.cgcc fun1.c fun2.c main.c -o app 

在这里插入图片描述
-o表示将前面的文件生成可执行文件app。

make

输入make命令,执行makefile文件,生成可执行文件app。
在这里插入图片描述
可以看到,终端会自动执行makefile里面的语句。这里只有一句编译命令,看不出makefile有多方便,但是当大型工程中编译命令有上百行的时候,只需要一句make就可以输出上百行编译命令,就会特别方便。
在这里插入图片描述

4. 工作原理

4.1 检查依赖

在这里插入图片描述
在执行命令之前,需要先检查规则中的依赖(红色框)是否存在。如果存在,执行命令;如果不存在,向下检查其他规则,检查是否存在一个规则用来生成该依赖,如果找到了,则执行该规则中的命令。看下面这样一个例子(版本2)。
在这里插入图片描述
.o文件是汇编之后得到的文件,但是还没有进行链接,只有进行了链接才能生成可执行文件。
-c命令能够编译、汇编指定的c文件,生成.o文件,但是不进行链接。

makefile文件一共存在四条规则。当检查第一条规则的依赖时,发现这些.o文件都不存在,就会向下检查其他规则,发现存在规则生成.o文件,所以执行规则中的命令。
在这里插入图片描述
通过命令行能发现,make先执行了生成.o文件的下面三条规则,以便生成第一条的依赖,然后再执行第一条规则生成可执行文件。

4.2 检查更新

在执行规则中的命令是,会比较目标和依赖文件的时间。如果依赖的时间比目标的时间晚,需要重新生成目标。如果依赖的时间比目标的时间早,目标则不需要更新,对应规则中的命令不需要被执行。
在这里插入图片描述
当我们再次执行make,显示可执行文件app已经是最新的。接下来简单修改下main.c文件,中间随便加点注释,再次执行make。
在这里插入图片描述
会发现make命令执行了生成main.o的规则以及生成app的规则。这是因为对于main.o :main.c,因为main.c发生修改,文件的时间会更新,所以变成依赖main.c的时间比目标main.o的时间晚,需要重新生成目标。对于生成app的规则同理。

所以要合理利用这条规则,可以将编译分为多条规则(上面的版本2)执行,而不是一条规则(上面的版本1)。如果仅有一条规则,只要其中一个依赖发生改变,就会全部重新编译。

5. makefile中的变量

预定义变量

  • AR:归档维护程序的名称,默认值为ar
  • CC:C编译器的名称,默认值为cc
  • CXX:C++编译器的名称,默认值为g++
  • $@:目标的完整名称
  • $<:第一个依赖文件的名称
  • $^:所有的依赖文件

自定义变量:变量名=变量值
获取变量的值:$(变量名)

通过修改获得makefile第3个版本,通过定义变量,获取变量。
在这里插入图片描述

6.模式匹配

%.o : %.c

%:通配符,匹配一个字符串;两个%对应的是同一个字符串

当执行第一条规则,发现.o文件不存在,就会去检查下面的规则是否能生成该依赖。对于模式匹配,只要符合条件,就能执行。
在这里插入图片描述
第二条模式匹配规则是,将依赖.c文件生成目标.o文件,命令行中 ( C C ) 代 表 获 取 C 编 译 器 , (CC)代表获取C编译器, (CC)C<代表获取第一个依赖的名称,$@代表获取目标的完整名称。运行后可以正常执行。
在这里插入图片描述

7.函数

$(wildcard PATTERN...)

功能:获取指定目录下指定类型的文件列表,PATTERN代表目录,如果有多个目标,一般使用空格间隔。

$(patsubst <pattern>, <replacement>, <text>)

功能:查找 中的单词(单词以“空格”、“Tab”、“换行”分隔)是否符合模式,如果匹配,则以替换。

可以包括通配符“%”,表示任意长度的字符串。如果想要实际使用普通的“%”,前面需要加转义字符,“%”。
在这里插入图片描述
修改获取第四个版本。对于第一条规则,我们需要的是.o文件,但是.o文件目前还没有生成,所以必须先通过函数获取.c文件,再进行替换获取.o文件。

src变量代表获取当前目录下所以的.c文件,即fun1.c、fun2.c、main.c。

objx变量代表,将刚才获取的src变量(所以.c文件),找到符合%.c的那部分,然后替换成%.o,实际上就是得到了fun1.o、fun2.o、main.o。
在这里插入图片描述
重新执行make,运行成功。
在这里插入图片描述

通过ls命令可以发现make生成了很多中间.o文件,这些中间文件是为了生成最终的可执行文件,但是生成之后就没啥用的。所以可以加上rm命令删除掉。
在这里插入图片描述


http://chatgpt.dhexx.cn/article/qrMJUkFG.shtml

相关文章

计算一幅图像的信噪比

计算一幅图像的信噪比 适用情况计算步骤附matlab代码example计算结果计算峰值信噪比 大家好&#xff0c;这是我两年前写的一篇博客修正版本&#xff0c;本来打算删掉了&#xff0c;但是阅读量很多&#xff0c;可能对大家会有一点小小的帮助&#xff0c;就重新放上来吧。 适用情…

两种常用的全参考图像质量评价指标——峰值信噪比(PSNR)和结构相似性(SSIM)

原文&#xff1a;https://blog.csdn.net/zjyruobing/article/details/49908979 1.PSNR&#xff08;Peak Signal to Noise Ratio&#xff09;峰值信噪比&#xff1a; MSE表示当前图像X和参考图像Y的均方误差&#xff08;Mean Square Error&#xff09;&#xff0c;H、W分别为图…

图像信噪比的理解

图像的信噪比和图像的清晰度一样&#xff0c;都是衡量图像质量高低的重要指标。图像的信噪比是指视频信号的大小与噪波信号大小的比值&#xff0c;其公式为&#xff1a; S/N&#xff08;信噪比&#xff09; 20 log (信号/噪声)dB信噪比大&#xff0c;图像画面就干净&#xff0…

相机的信噪比

在图像传感器的成像过程中&#xff0c;真实的信号是无法探测到的理想值。在成像过程中理想值被引入了一系列的不确定性&#xff0c;最终形成读出信号也即图像。此过程中的不确定性被统一称为噪声。而信号与噪声的比值被定义为信噪比&#xff08;Signal-to-NoiseRatio, SNR&…

信噪比(SNR)

信噪比&#xff08;Signal-to-noise ratio&#xff0c;缩写为 SNR 或 S/N&#xff09;&#xff0c;也称作信杂比或讯杂比。 信噪比&#xff0c;为有用信号功率(Power of Signal)与噪声功率(Power of Noise)的比。因此为幅度&#xff08;Amplitude&#xff09;比的平方&#xff…

信干噪比、信噪比

信干噪比 名词定义 信干噪比SINR&#xff08;Signal to Interference plus Noise Ratio&#xff09;&#xff0c;指的是系统中信号与干扰和噪声之和的比。 信号是指来自设备外部需要通过设备进行处理的电子信号。 干扰是指系统本身以及异系统带来的干扰&#xff0c;如同频干扰…

图像的峰值信噪比(peak signal to noise ratio, PSNR)

峰值信噪比&#xff08;PSNR&#xff09;是一个表示信号最大可能功率和影响它的表示精度的破坏性噪声功率的比值的工程术语。由于许多信号都有非常宽的动态范围&#xff0c;峰值信噪比常用对数分贝单位来表示。 在图像处理中&#xff0c;要对图像进行客观的评价&#xff0c;常…

图像处理随笔之峰值信噪比(peak signal to noise ratio)

图像处理随笔之峰值信噪比&#xff08;peak signal to noise ratio&#xff09; the definition from WIKI&#xff1a;an engineering term for the ratio between the maximum power of a signal and the power of corrupting noise that affects the fidelity of its repre…

python求不同分辨率图像的峰值信噪比,一文搞懂

可以使用 Python 的 NumPy 和 OpenCV 库来实现这个任务。提前准备一张图片作为素材。 文章目录 什么是峰值信噪比PSNR 峰值信噪比补充说明 使用 OpenCV 库来实现这个任务PSNR 的计算值受图像的亮度影响计算不同分辨率图像的 PSNRpython 求不同分辨率图像的峰值信噪比 | 其他知识…

【深度学习】图像去雾,去噪里常用的相似评价指标:PSNR(峰值信噪比) SSIM(结构相似度)MSE(均方误差)

文章目录 一、PSNR&#xff08;峰值信噪比&#xff09;二、SSIM&#xff08;结构相似度&#xff09;三、MSE&#xff08;均方误差&#xff09;小插曲&#xff1a;plt.savefig&#xff08;&#xff09;保存的图片为空白 一、PSNR&#xff08;峰值信噪比&#xff09; 公式直接抄我…

信噪比

fft原理 能量谱 &#xff08;5&#xff09;能量信号频谱通常既含有幅度也含有相位信息&#xff1b;幅度谱的平方&#xff08;二次量纲&#xff09;又叫能量谱&#xff08;密度&#xff09;&#xff0c;它描述了信号能量的频域分布&#xff1b;功率信号的功率谱&#xff08;密…

PSNR峰值信噪比matlab实现

PSNR&#xff0c;峰值信噪比&#xff0c;通常用来评价一幅图像压缩后和原图像相比质量的好坏&#xff0c;当然&#xff0c;压缩后图像一定会比原图像质量差的&#xff0c;所以就用这样一个评价指标来规定标准了。PSNR越高&#xff0c;压缩后失真越小。这里主要定义了两个值&…

psnr--峰值信噪比

psnr是“Peak Signal to Noise Ratio”的缩写&#xff0c;即峰值信噪比&#xff0c;是一种评价图像的客观标准&#xff0c;它具有局限性&#xff0c;一般是用于最大值信号和背景噪音之间的一个工程项目。 中文名 PSNR 外文名 Peak Signal to Noise Ratio” 意 义 峰值…

信噪比的定义及计算方法

1.信噪比的定义 英文名称叫做SNR或S/N&#xff08;SIGNAL-NOISE RATIO)&#xff0c;又称为讯噪比。是指一个电子设备或者电子系统中信号与噪声的比例。这里面的信号指的是来自设备外部需要通过这台设备进行处理的电子信号&#xff0c;噪声是指经过该设备后产生的原信号中并不存…

PSNR峰值信噪比(python代码实现+SSIM+MSIM)

一、原理 psnr是“Peak Signal to Noise Ratio”的缩写&#xff0c;即峰值信噪比&#xff0c;是一种评价图像的客观标准 用来表示信号最大可能功率和影响它的表示精度的破坏性噪声功率的比值&#xff0c;可以显示图像画质损失的程度。峰值信噪比越大&#xff0c;表示画质损失…

opencv图像处理学习(五十七)——峰值信噪比和结构相似性

1.峰值信噪比 峰值信噪比是常用的衡量信号失真的指标。该参数是基于图像像素灰度值进行统计分析&#xff0c;但是由于人类视觉特性的差异性&#xff0c;通常出现的评价结果与人的主管感觉不一致&#xff0c;但其仍然是一个有参考价值的评价指标。对于两幅图像I与K&#xff0c;…

用户自定义函数UDF

SQL DDL&#xff1a;用户自定义函数UDF 什么是UDF&#xff1f; Hive支持的函数除了内置函数&#xff0c;允许编写用户自定义函数&#xff08;User Define Function&#xff09;来扩充函数的功能。 用户自定义函数需要使用Java语言进行编写&#xff0c;完成的UDF可以打包成Ja…

hive笔记八:自定义函数-自定义UDF函数/自定义UDTF函数

目录 自定义函数 自定义UDF函数 自定义UDTF函数 自定义函数 Hive自带一些函数&#xff0c;比如&#xff1a;max/min等&#xff1b;当Hive提供的内置函数无法满足你的业务处理需要时&#xff0c;此时就可以考虑使用用户自定义函数。 UDF&#xff1a;user-defined function …

用python实现Hive中的UDF函数

用python实现Hive中的UDF函数 简介 Hive为我们提供了众多的内置函数&#xff0c;但是在实际的运用过程中仍然不能满足我们所有的需求.hive是用java开发的&#xff0c;本身提供了使用java去开发UDF的方式.而这里我们采用python的方式去实现UDF函数. DEMO实现 我们这里用pyth…

hive创建udf函数流程

1.编写udf函数 引入pom文件 <dependencies> <dependency> <!-- 这个属于额外的jar包 自己按需引用 比如你想搞得函数 里面要连接mysql 这里肯定需要引入mysql的驱动包 我这个包是为了计算字符串的表达式的。 --> <groupId>org.apache.com…