【Linux基础】如何编写Makefile文件?

article/2025/9/26 21:20:54

文章目录

  • 前言
  • 一、make工具简介
    • 1.什么是make?
    • 2.如何安装make?
  • 二、编写Makefile文件
    • 1.文件组成
    • 2.工作原理
    • 3.Makefile文件优点
    • 4.单级目录下的Makefile文件编写
    • 5.多级目录下的Makefile文件编写
  • 总结


前言

   我们刚开始在Linux系统下进行编程时,采用的编译方法为:将程序所引用的文件打包成静态库/共享库,再使用生成的静态库/共享库与源程序一起编译成可执行文件
   然而,我们发现在一个中大型的C/C++工程中,往往包含了成百上千个源文件。如果我们使用上述方法编译,编译命令就会变得十分冗长,在输入命令的过程中容易出错。即便是正确输入了编译命令,在进行编译过程中,也会耗费较长的编译时间。显然,手动编译并不适用于大部分的Linux编程场景。
   为解决以上问题,我们将在本篇中学习如何编写Makefile文件完成自动化编译。


一、make工具简介

   在学习编写Makefile文件之前,我们需要先了解Linux系统中一个非常重要的编译命令make

1.什么是make?

   make是用于自动编译,链接程序的实用工具。它最主要最基本的功能就是通过makefile文件来描述源程序之间的相应关系,并自动维护编译工作。
   使用make工具的好处在于,在编译完成之后,若修改了某个源代码,make只对修改后的部分进行编译,其他目标文件不会更改,并且会安装文件依赖性来更新执行文件。大大提高了编译效率。

2.如何安装make?

  (1)进入root权限,终端命令:sudo su

  (2)进入更新列表,终端命令:apt-get update

  (3)Linux安装make,终端命令:apt-get install ubuntu-make

  (4)验证是否安装成功,终端命令:make -v,显示所安装make的版本号即安装成功。

二、编写Makefile文件

1.文件组成

  • makefile三要素:targets(目标),prequisities(依赖),command(命令)
  • 每个依赖关系由一个目标文件和一组该目标所需的源文件(依赖文件)构成。
  • 命令则描述了如何通过这些依赖关系文件创建目标。

makefile文件格式如下:
             目标文件:依赖文件
             [tab键] gcc -o 目标文件 依赖文件

2.工作原理

  • 目标生成:检查规则中的依赖是否存在,若依赖文件不存在,则寻找是否有规则生成依赖文件。
  • 目标更新:检查目标文件的所有依赖文件,任何一个依赖文件有更新时,就重新生成目标文件。

3.Makefile文件优点

(1)减少重复编译时间

   在改动其中一个文件时,能判断哪些文件被修改过,只对该文件进行重新编译,然后重新链接所有目标文件, 大大提高了编译效率,节省了编译时间。

(2)利于大量代码关系维护

   中大型工程中源代码较多,手工维护编译时间长,且编译命令复杂,把代码维护命令和编译命令写在makefile文件中,然后再用make工具解析此文件自动执行相应命令,实现高效编译。

4.单级目录下的Makefile文件编写

(1)第一版本,通俗易懂但不通用

在这里插入图片描述

(2)第二版本,变量obj类似C/C++中的宏定义,进行等量替换

在这里插入图片描述

(3)第三版本,将依赖文件改成相应的头文件,make命令在编译过程中会自动推导

在这里插入图片描述

(4)第四版本,$@目标文件;$^所有依赖文件;$<第一个依赖文件

在这里插入图片描述

(5)第五版本,wildcard函数,查找文件下所有文件名;patsubst函数,查找替换

在这里插入图片描述

5.多级目录下的Makefile文件编写

   当工程文件比较大时,我们可以采用文件分类的方式,将工程文件分为头文件(include)源文件(src)目标文件(obj)可执行文件(bin),并在这几个文件的同级目录下编写makefile文件,如下图所示。

在这里插入图片描述

此时,对应的makefile文件通用写法,如下所示。

DIR_INC = ./include
DIR_SRC = ./src
DIR_OBJ = ./obj
DIR_BIN = ./binSRC = $(wildcard ${DIR_SRC}/*.c)
OBJ = $(patsubst %.c,${DIR_OBJ}/%.o,$(notdir ${SRC}))TARGET = mainBIN_TARGET = ${DIR_BIN}/${TARGET}CC = gcc
CFLAGS = -g -Wall -I${DIR_INC}${BIN_TARGET}:${OBJ}$(CC) $(OBJ)  -o $@${DIR_OBJ}/%.o:${DIR_SRC}/%.c$(CC) $(CFLAGS) -c  $< -o $@clean:find ${DIR_OBJ} -name *.o -exec rm -rf {} \;

总结

   以上就是关于如何编写Makefile文件的所有内容,希望大家阅读后都能有所收获!原创不易,转载请标明出处,若文章出现有误之处,欢迎读者留言指正批评!

在这里插入图片描述


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

相关文章

从0开始教你编写Makefile文件

目录 编写Makefile第一步&#xff0c;了解什么是Makefile&#xff1f; 编写Makefile第二步&#xff0c;明白编译链接过程 编写Makefile第三步&#xff0c;实现简单的Makefile(生成单个可执行文件) 解释一下一个简简单单的make都干了什么&#xff1f; 编写Makefile第四步&am…

C语言makefile文件

文章目录 一、makefile的编写二、make命令三、makefile文件中的变量四、应用经验五、课后作业六、版权声明 在软件的工程中的源文件是很多的&#xff0c;其按照类型、功能、模块分别放在若干个目录和文件中&#xff0c;哪些文件需要编译&#xff0c;那些文件需要后编译&#xf…

【Linux】Makefile文件

1.Makefile的作用 Makefile文件定义了一系列的规则来指定哪些文件需要先编译&#xff0c;哪些文件需要后编译&#xff0c;哪些文件需要重新编译&#xff0c;可以实现自动化编译&#xff0c;一旦写好&#xff0c;只需要一个make命令&#xff0c;整个工程完全自动编译&#xff0…

计算一幅图像的信噪比

计算一幅图像的信噪比 适用情况计算步骤附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…