如何编写makefile文件

article/2025/9/26 21:08:21

文章目录

  • 1. makefile文件的作用
  • 2. makefile文件编写格式
    • C++代码举例编写makefile文件
  • 3. makefile编写习惯优化
    • 使用中间文件
    • 定义变量
    • 自动变量
    • 通配符
    • 假想目标


1. makefile文件的作用

在很多的生产环境中,一个项目的运行往往要有很多源程序文件生成最终的可执行文件,这个执行过程往往很复杂,所以很多工作者就会借助make命令来实现自动编译,而makefile文件就是告诉make命令如何去编译和链接一个程序。

2. makefile文件编写格式

按如下格式编写Makefile

目标文件(target): 依赖文件(prerequiries)...执行命令(command)

注意:

  • makefile文件是由一条一条的规则构成的,每条规则是由三部分构成的:目标文件、依赖文件、执行命令;
  • 默认情况下,makefile文件只会执行第一条规则。很多读者可能会有疑惑,我们看多的makefile文件中往往不止一条规则,这是因为我们规则中的依赖关系决定的,依赖将文件中的所有规则串在了一起;
  • makefile文件中的注释以#开头;
  • makefile文件中的命令前是一个[tab]键,这一点很重要,不要敲成空格哦;

C++代码举例编写makefile文件

我们有如下几个文件:

overload.cpp

#include "Test.h"
int Add(float a, long b){return a+b;
}int num;class Simple{
public:Simple(){}Simple(const Simple& s){}   Simple& operator=(const Simple&){ return *this; }~Simple(){}
};void Func();int main(){int c = Add(10, 11);
}

Test.cpp

#include "Test.h"
int Add(int a, int b){return a+b;
}
void FuncTest(){}

Test.h

#pragma onceint Add(int a, int b);void FuncTest();

我们编写如下的makefile文件:

Test:overload.cpp Test.cppg++ overload.cpp Test.cpp -o Test
clean:rm Test

在命令行执行make命令,进行编译,需要注意的是,当我们生成的可执行文件已经是目前代码所对应的最新版本的时候,make命令执行结束后,会提示该文件已经是最新文件。当我们的程序有所变化时,我们执行make命令将会正常进行编译和链接。这也是makefile文件的优点之一。

除此以外,我们编写的第二条规则可以使用make 目标文件进行编译,针对我们上述文件,我们可以使用make clean执行删除命令。

3. makefile编写习惯优化

以上我们已经编写好了makefile文件,我们引入了如下的一些优化,从上文的文件一步步进行优化并给出每个阶段的makefile文件内容:

使用中间文件

我们在项目中常常使用.o文件作为目标文件编写makefile文件进行编写,这样我们如果程序中的某一个源程序发生了改变就只会重新编译该源程序文件,而不需要重新编译所有的原程序代码。

以上的makefile文件就可以写作如下:

Test:overload.o Test.og++ overload.o Test.o -o Test
overload.o:overload.cppg++ -c overload.cpp
Test.o:Test.cppg++ -c Test.cpp
clean:rm Test *.o

注意:*.o代表任意以.o结尾的文件

定义变量

如果我们的项目需要增加一个文件进行编译,那么我们同时还需要修改makefile文件,如果规则较少还好,当规则较多的时候,我们进行修改就很不友好,可能需要通篇进行修改,而且还容易导致遗漏,所以我们通过定义变量来避免出现这种错误。

变变量是定义一个字符串,在多处替代该字符串使用。变量定义格式如下:

变量 = 字符串
OBJS = overload.o Test.o

除此以外,系统还自己定义了一些变量供我们使用,这种变量成为预定义变量:

变量用途默认值
CCC语言编译程序cc
CXXC++编译程序g++
ARC++打包程序ar
CPP带有标准输出的C语言预处理程序$(CC) -E
RM删除命令rm

我们使用变量来进修改我们的makefile文件如下:

CXXFLAGS = -g
TARGET = Test
OBJECTS = overload.o Test.o
$(TARGET):$(OBJECTS)$(CXX) $(CXXFLAGS) $(OBJECTS) -o $(TARGET)
overload.o:overload.cpp$(CXX) $(CXXFLAGS) -c overload.cpp
Test.o:Test.cpp$(CXX) $(CXXFLAGS) -c Test.cpp
clean:$(RM) Test *.o

自动变量

自动变量是在规则每次执行时都基于目标和依赖产生新值的变量。我们可以直接使用自自动变量来进行推导和匹配,书写更加的方便,下面是常用的自动变量。

自动变量含义
$<表示第一个匹配的依赖
$@表示目标
$^所有依赖
$?所有依赖中更新的文件
$+所有依赖文件不去重
$(@D)目标文件路径
$(@F)目标文件名称

我们使用自动变量修改makefile文件如下:

CXXFLAGS = -g
TARGET = Test
OBJECTS = overload.o Test.o
$(TARGET):$(OBJECTS)$(CXX) $(CXXFLAGS) $^ -o $@
overload.o:overload.cpp$(CXX) $(CXXFLAGS) -c $<
Test.o:Test.cpp$(CXX) $(CXXFLAGS) -c  $<
clean:$(RM) Test *.o

通配符

如上我们编写的makefile文件中有重复代码,我们可以使用通配符来进行简化。通配符主要用于匹配文件名,makefile中使用%作为通配符。从匹配目标格式的目标名中依据通配符抽取部分字符串,再按照抽取字符串分配到每一个依赖格式中产生依赖名。例如,使用%.o:%.cpp优化makefile文件。

该规则推导如下:

  • 匹配一个字符串为%,就找到了一个了%.o文件,该文件自动推导到该字符串结尾的.cpp文件,这时的依赖文件为.cpp结尾的文件,目标文件为.o结尾的文件。
    在这里插入图片描述

我们使用通配符修改makefile文件如下:

CXXFLAGS = -g
TARGET = Test
OBJECTS = overload.o Test.o
$(TARGET):$(OBJECTS)$(CXX) $(CXXFLAGS) $^ -o $@
$(OBJECTS):%.o:%.cpp$(CXX) $(CXXFLAGS) -c $<clean:$(RM) Test *.o

假想目标

如我们编写的makefile文件中的目标文件为clean,该目标其是不是一个文件,我们只是将其作为删除命令的规则名称。但是若我们该makefile的同级目录中有假想目标同名的文件,就会造成一些问题,所以我们需要将这种目标声明为假象目标,告诉编译器不需要找到该目标同名的文件。

声明规则:

.PHONY 目标

我们修改makefile文件如下:

CXXFLAGS = -g
TARGET = Test
OBJECTS = overload.o\Test.o
.PHONY:clean allall:$(OBJECTS)$(TARGET):$(OBJECTS)@echo 生成可执行文件$(CXX) $(CXXFLAGS) $^ -o $@
$(OBJECTS):%.o:%.cpp$(CXX) $(CXXFLAGS) -c $<
clean:@echo 清空文件$(RM) Test *.o

注意:

  • \ :指的是换行
  • @echo : 回显信息作为提示

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

相关文章

Linux下makefile文件的编写

在学习如何编写makefile文件之前&#xff0c;我们首先需要了解什么是makefile文件&#xff1a; makefile描述了整个工程的编译和链接等规则。它指明了哪些文件需要先编译&#xff0c;哪写文件需要后编译&#xff0c;哪些文件需要重新编译&#xff0c;甚至进行更复杂的功能操作。…

Makefile文件详解一(怎么在Windows下使用Makefile文件)

前言&#xff1a;如果熟悉在Linux开发的话&#xff0c;肯定知道Makefile文件的用处&#xff0c;它给我们带来很多的便利。在Linux系统下并不会像Windows那么多开发工具&#xff0c;在Windows下&#xff0c;只要在开发工具上点击一个按钮&#xff0c;就能将工程的所有源码进行编…

makefile文件编写

makefile文件用于管理和组织代码工程的编译和链接&#xff0c;其不是可执行文件&#xff0c;其被make工具解析并完成相关动作&#xff0c;下面笔者将介绍makefile中常用的一些语法说明&#xff1a; 1、文件包含&#xff1a; 语法&#xff1a;include 文件名 作用&#xff1a;…

make中makefile文件的创建和使用

Makefile文件就是一种定义规则的文件&#xff0c;规则不同但格式基本相同&#xff0c;如图 一个makefile中有多个规则&#xff0c;但最终形成一个makefile文件&#xff0c;且只有一个终极目标&#xff0c;第一行就是终极目标。 格式: 1.目标文件&#xff1a;&#xff08;如mai…

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

文章目录 前言一、make工具简介1.什么是make?2.如何安装make? 二、编写Makefile文件1.文件组成2.工作原理3.Makefile文件优点4.单级目录下的Makefile文件编写5.多级目录下的Makefile文件编写 总结 前言 我们刚开始在Linux系统下进行编程时&#xff0c;采用的编译方法为&#…

从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;压缩后失真越小。这里主要定义了两个值&…