如何编写一个简单的Makefile文件

article/2025/9/26 19:46:46

在c语言学习的初级阶段,我们所写的代码量较少,分装的文件也很少,直接使用gcc编译便能满足我们的大部分需求,然而随着我们学习的深入,代码量越来越多,已经开始做一些工程项目了,项目中包含多个c文件,使用gcc应把所有的文件从头编译一遍,这时候再使用gcc编译就会显得十分麻烦了。这时,就需要一个我们之后做工程项目时要经常用到的一个make工具了。

make工具,我们又称它工程管理器,顾名思义,它可以帮助我们更好更方便的管理我们的工程文件。在我们项目中加入新内容或者我们编译出错时,使用gcc要将这些文件一个一个重复输入编译,对比一下make工具,它能够根据文件的时间戳自动发现更新的文件来减少编译的工作量,减少了编译时间,如果我们的Makefile文件写的好,只需要一个make指令就能解决,属实提高了我们的效率。

例如有一个编译main.c和add.c成可执行文件add,我们第一次make时:

当我修改了一下main.c之后再编译:

可以看见,它没有再编译add.c的那一部分。

Makefile的基本编写

接下来我们开始讲Makefile,Makefile是make读入的唯一配置文件,make通过解析Makefile里面的指令来对项目中的代码进行编译,进而生成可执行文件,但是Makefile文件编写有一定的规则,这也是我们接下来要着重讲的内容。

首先,Makefile的基本编写格式为:

目标:依赖

命令

定义了目标和依赖后在之后的命令行要以Tab键开头,必需严格依照这种格式。在下面我再举两个例子,例子中add为可执行文件,add.o为生成add的二进制文件,add.c为编译成add.o的源代码。

add:add.ogcc add.o -o add
add.o:add.cgcc -c add.c -o add.o

为防某些同学不知道-c、-o的作用,我这里再叨唠两句。-c是只编译,不连接生成可执行文件,编译器只将源代码生成.o的二进制文件,“-o filename”可以输出文件”filename“,除此之外对代码进行gdb调试就需要使用-g,-O可以优化编译链接。

我们可以看到生成add可执行文件依赖于add.o,下一行命令紧跟编译生成add倒序编译,先编写二进制.o文件生成可执行文件的语句,再写目标add.o和它的依赖add.c,下面写.c文件生成.o文件的语句。

注意,如果前面的目标文件和后边的目标文件没有依赖关系的话,那么系统会默认只生成第一个目标文件。如果我们输入make后没加其他指令,make会默认的执行第一条语句。所以,我们经常将我们需要生成的目标文件放到第一条去写,这样,我们只需要输入make就可以实现我们的编译工作。

以上讲的主要是有目标有依赖的情况,接下来我再讲一下有目标无依赖的例子。

指令名:

需要执行的指令

在使用这个指令时,我们只需要输入 make 指令名 便可以实现我们想要执行的指令。

若项目中有和指令名同名的可执行文件文件,执行 make 指令名 时,make会以为目标已实现,所以不会执行我们Makefile中的指令。要想使用这条指令的话,我们可以先声明一下。

.PHONY 的作用是声明一个伪指令,它的基本格式为:

.PHONY:指令名

指令名:

需要执行的指令

例如,我想做一个能清除垃圾文件或者其他不想要的文件时,我可以这样定义:

这样,我只需要执行 make clean 便可以实现清除当前项目下的所有 .o文件和生成的可执行文件add。

.PHONY:clean
clean:rm add *.o

然而,这还是不够简洁,如果我们的工程项目中加入了其他新的文件或者是提出了其他新的要求,我们在Makefile文件中再进行修改还是输入新的指令。这时候变量的优势就体现出来了。

引入变量后的Makefile编写

首先我们可以先预定义一些变量,例如:

CC=gcc
CFLAGS=-c -g -O            (gcc的选项)
OBJ=executable file        (可执行文件)
OBJS=file1.o file2.o ...   (一般为生成可执行文件的二进制文件)

除此之外我们还要知道一些自动变量

$< 第一个依赖文件的名称

$@ 目标文件的完整名称

$^ 所有不重复的目标依赖文件,以空格分开

$:取变量的值;%是所有的同名文件,类似于*

例如我们编译main.c和add.c生成可执行文件add的过程。

在使用变量前:

add:add.o main.ogcc add.o main.o
add.o:add.cgcc -c add.c -o add.o
main.o:main.cgcc -c main.c -o main.o

在使用变量后:

CC=gcc
CFLAGS=-c -g -O
OBJS=add.o main.o
add:$(OBJS)$(CC) $(OBJS) -o add
$(OBJS):%.o:%.c$(CC) $(CFLAGS) $^ -o $@

这样我们在后面的工程中添加了新的文件,那么我们只需修改预定义OBJS的那一行就可以了。

可能相较于直接编写它的书写格式比较繁琐,而且文件和依赖不是很直观,在我们文件较多时他的优势他就体现出来了。当然,具体使用哪种方法还是见仁见智,喜欢那个就用那个就好了。

以上就是关于Makefile文件的简单编写,如有不足之处,还望指正。


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

相关文章

Linux下编写makefile文件

首先在vi编辑器下编写add.c #include "test.h" #include <stdio.h> int add(int a, int b) { return a b; } int main() { printf(" 2 3 %d\n", add(2, 3)); printf(" 5 - 3 %d\n", sub(5, 3)); return 1; } 再编写sub.c…

如何创建 makefile文件

在学习 任哲《嵌入式实时操作系统 uCOS-II 原理及应用》中如何创建makefile文件呢&#xff1f; 1&#xff0c;创建一个名为makefile的文件&#xff08;取消扩展名&#xff09; 输入下面命令示例内容 target1: md 11 target2: md 22 target3: rd 11 rd 22 2&am…

Makefile文件的简单编写

参考&#xff1a; MakeFile文件是什么——内容、工作原理、作用、使用 嵌入式操作系统linux篇&#xff08;书&#xff09; Makefile伪目标 GNU make中文手册.pdf 在嵌入式开发中&#xff0c;一个工程中的源文件是非常多的&#xff0c;如果一个个编译会很麻烦&#xff0c;Makefi…

带你去了解什么是makefile文件

GNU make命令是用来控制从源文件生成可执行文件或非可执行文件的方式。那么make命令又是通过makefile文件来控制了。所以了解makefile文件就显得很有必要了。 makefile文件由许多规则组成&#xff0c;这些规则的形式一般是这样的&#xff1a; 目标 ... : 先决条件 ...命令目标…

linux下制作makefile文件

1.最简单的一种当然也是最麻烦的一种(makefile 中的代码如下&#xff0c;其中hello.cpp是文件名&#xff0c;hello是编译后的命名。使用方法是直接输入 make) hello:hello.cpp …

编写 Makefile文件 (一)

参考&#xff1a;《linux程序设计&#xff08;第四版&#xff09;》 本文的编写从简单到复杂&#xff0c;一步一步完成Makefile文件的编写和完善。首先看一下我们的程序有哪些文件&#xff1a; 文件内的程序也很简单&#xff0c;就是输出该文件已经被调用&#xff0c;代码如下…

如何编写makefile文件

文章目录 1. makefile文件的作用2. makefile文件编写格式C代码举例编写makefile文件 3. makefile编写习惯优化使用中间文件定义变量自动变量通配符假想目标 1. makefile文件的作用 在很多的生产环境中&#xff0c;一个项目的运行往往要有很多源程序文件生成最终的可执行文件&am…

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…