Linux中Makefile详细教程

article/2025/9/12 15:23:33

目录

Makefile

Makefile的介绍

Makefile简单的编写

.PHONY

问题:

如果只执行make,它执行的是Makefile里哪一段语句呢?

怎么知道我的可执行程序是最新的呢?

Makefile编译多个文件

进度条小程序


Makefile

Makefile的介绍

make是一个命令

makefile/Makefile是一个文件.

1.什么是Makefile脚本?
    Makefile脚本集合了程序的编译指令的文件,make是一个命令工具,当执行make命令时,它会自动读取Makefile中的编译指令并执行,会自动完成整个项目的自动化编译工作.

2.为什么需要Makefile脚本:
    项目中如果有很多.c文件,它们的编译指令会有很多,需要的编译时间比较长,依赖关系非常复杂。    
    当项目中的.h文件被修改时,对应的.c文件需要重新编译,但是我们无法人为的分辨出哪些文件需要重新编译,只能全部重新编译一下,这项操作非常耗时。此时Makefile便发挥了用场.

所以make/Makefile又叫自动化的构建项目.

Makefile简单的编写

Makefile主要由两部分组成:a.依赖关系,b.依赖方法
我们举个例子:

你在学校,然后给你爸打电话,电话通了之后你说: "爸,我是你儿子",然后就直接挂了.

这样你就表明了依赖关系,我们是父子关系,但是后面什么都没有说了,你爸爸以为你遇到了什么危险.

这个时候你又打过去了说:“孩子没钱了,打点生活费吧",此时这个便才是依赖方法.

所以我们Makefile要达成一个目的,必须要满足这两个条件.

我们举个实际代码的例子来理解:

我们直接

    vim Makefile

此时便会创建一个Makefile文件并且打开.

假设此时有一个test.c源文件,我们想编译成mytest可以执行文件.

依赖关系:

mytest:test.c

其中mytest称作目标文件,test.c称作依赖文件.

依赖方法:

必须第依赖关系的下一行,以Tab键为空开始写.

编译源文件,需要用到gcc,之前所讲过的.

         gcc test.c -o mytest 

这样一个简单的Makefile文件便写好了.

 从vim中退出来,编写一个简单的test.c文件:

此时目录下会有两个我们刚才创建的文件:Makefile和test.c

我们直接执行make命令:

 

 我们发现执行命令之后,有了我们想要的mytest可执行文件,然后再./执行这个文件,发现程序成功运行了.

.PHONY

那如果我们想清理某个文件,该怎么写呢?既然是清理文件那还需要依赖什么文件删除吗?

这个时候需要用一个东西叫 .PHONY伪目标.

因为我们clean目的是清除某些文件,而删除操作又不会需要依赖文件,所以会创建一个伪目标,相当于依赖这个伪目标,然后执行依赖方法.

格式如下:

1.先在前面写一个.PHONY:clean

2.第二行紧接着输入clean:

3.Tab键开头,然后输入依赖方法 rm -rf mytest

所以输入进去应该是这样:

然后我们使用一下它。退出vim,执行make clean

 

 我们发现mytest文件被删除了.

还有一个作用就是总是被执行.

什么叫总是被执行呢?先来看如果我们一直make会发生什么呢?

 可以发现这里的意思是说mytest已经是最新了.但是我就是想让它每次都执行,这个时候你在前面加上.PHONY即可:

 然后退出,便可以每次都被执行了.

 这里有一个问题:

问题:

如果只执行make,它执行的是Makefile里哪一段语句呢?

默认是执行第一个依赖关系和依赖方法.

我们第一个写的是gcc编译的,第二个才是clean,所以我们直接执行make是将test.c源文件编译成mytest可执行文件.

为了验证,我们可以交换一下两个的顺序:

退出vim, 此时我们执行make,发现执行的语句成为了rm

想要编译,需要自己手动输入:make mytest.

 

此时便编译完成,生成了一个可执行文件.

 还是紧接着上面的,它是

怎么知道我的可执行程序是最新的呢?

根据文件的最近修改时间

这里有一条命令stat,它可以查看一个文件的重要的三个时间!

Access:最近的访问时间.

Modify: 最近的内容修改时间,比如你修改了文件的内容,这个时间就会改变.

Change:最近的属性修改时间,比如你修改了这个文件的读写权限,这样它的属性修改时间就会被修改.

我们知道一个文件是由内容+属性组成.如果内容被修改,那么文件的大小也会被修改,相应的属性修改时间也会改变,所以这点也要注意.

那是如何判断的呢?可执行文件形成的时间一定要晚于源文件。这点是大家可以理解的,因为可执行文件是由源文件编译生成的.

所以只需要比较两者的时间,只要可执行文件的时间一直比源文件晚(新),就说明这个可执行文件一直是最新的.

 

 我们如果修改源文件,此时源文件的时间就一定会比可执行文件新,这个时候再次可以执行gc

c便可以编译了.

如果有多个文件,我们该如何使用Makefile编写呢?

Makefile编译多个文件

首先创建一个test.h文件,用于声明:

再将test.c文件里内容做修改如下:

再创建一个main.c用于执行.

在编写Makefile时,我们习惯于把依赖文件写成.o的形式.而.o又需要.c来编译。所以Makefile会自动向下寻找这些编译语句,我们只要写上编译的语句即可. 

 

 执行make语句.

发现已经编译成功且正常输出.

 

这就是编译多个文件的方法了.

进度条小程序

vim pro.c,进入pro.c,然后输入代码:

    #include<stdio.h>                                                                                                                                                                                          #include<string.h>#include<unistd.h>#define NUM 102 int main(){char bar[NUM];memset(bar,0,sizeof(bar));int cnt = 0;const char* lable = "|/-\\";while(cnt <= 100){printf("[%-100s][%d%] %c\r",bar,cnt,lable[cnt%4]);bar[cnt++]='#';fflush(stdout);usleep(30000);}printf("\n");}

 vim Makefile,在Makefile下输入:

pro:pro.cgcc -o pro pro.c.PHONY:clean
clean:rm -rf pro  

然后退出vim,输入make,执行编译命令

最后./pro即可.

 Makefile相关的内容便结束了.

 


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

相关文章

Makefile入门教程

转载&#xff1a; https://www.linuxidc.com/Linux/2014-08/105304.htm Makefile入门教程 回顾 首先&#xff0c;我把需要的文件全部写出来&#xff08;在《GCC学习笔记》处&#xff09;。 main.c文件 #include <stdio.h> #include "math.h" int main() { int…

Makefile教程(入门介绍)

文章目录 前言一、Makefile介绍二、make和Makefile的关系三、学习makefile的意义四、编写一个简单的Makefile总结 前言 本篇文章将带大家学习Makefile&#xff0c;Makefile在文件的编译中起到重要作用&#xff0c;在Linux中我们也是经常使用到Makefile&#xff0c;下面我将会带…

VCS使用Makefile教程

在从事IC验证工作的过程中&#xff0c;其实最开始的一步不是写什么test plan或者说verification of structure&#xff0c;而是应该知道makefile怎么写&#xff0c;先写出一个通用&#xff0c;基础的编译仿真脚本&#xff0c;可能会让你编译仿真轻松一点。 这份Makefile使用教程…

Makefile教程(Makefile的结构)

文章目录 前言一、Makefile的结构二、深入案例三、Makefile中的一些技巧总结 前言 一、Makefile的结构 Makefile 通常由一系列规则组成&#xff0c;每条规则定义了如何从源文件生成目标文件。每个规则又由目标、依赖和命令三部分组成。 下面是 Makefile 规则的基本结构&…

linux初试gcc makefile菜鸟教程

linux初试gcc makefile菜鸟教程 1.实验环境 1.ubuntu16(安装教程) 2.gcc (gcc安装&#xff1a;apt install gcc) 3.make (make安装 apt install make) 用C举个小例子 2.源码 main.c /*************************************************************************> File N…

Makefile使用教程

目录 一、前言 二、VCS的常用命令参数 2.1. 一步法 2.2. 两步法 2.3. 三步法 三、常见错误 四、参考资料 一、前言 以Makefile启动VCS为例来讲解如何使用命令参数&#xff0c;VCS编译文件会引入过多参数&#xff0c;试想如果我们每次都需要终端中敲击过多参数才能运行一…

Makefile详细教程

Makefile详细教程 我编写本指南是因为我永远无法完全理解 Makefile。 他们似乎充斥着隐藏的规则和深奥的符号&#xff0c;提出简单的问题并没有得到简单的答案。 为了解决这个问题&#xff0c;我花了几个周末的时间坐下来阅读所有关于 Makefile 的内容。 我已将最关键的知识浓…

最实用的Makefile教程 真的很简单(搞不明白网上的教程写那么复杂干嘛)

前言 其实我的要求不高&#xff0c;我就是想要写个Makefile&#xff0c;把我那些需要反复编译的文件处理一下就可以了&#xff0c;所以我当时就拼命地在网上找关于Makefile的教程&#xff0c;结果看到的教程都是啰里啰嗦一大堆&#xff0c;看得我云里雾里。 大家要知道&#…

Makefile的入门完整教程(包学包会)

Makefile的完整入门教程&#xff08;实现不了来打我TAT&#xff09; 看完能够了解Makefile是什么&#xff1b;我们能用makefile做什么&#xff1b;makefile的简易使用 1、什么是Makefile Makefile 可以简单的认为是一个工程文件的编译规则&#xff0c;描述了整个工程的编译和…

Linux makefile 教程 非常详细,且易懂

最近在学习Linux下的C编程&#xff0c;买了一本叫《Linux环境下的C编程指南》读到makefile就越看越迷糊&#xff0c;可能是我的理解能不行。 于是google到了以下这篇文章。通俗易懂。然后把它贴出来&#xff0c;方便学习。 后记&#xff0c;看完发现这篇文章和《Linux环境下的C…

Makefile基础教程

前期准备 在真正使用Makefile之前&#xff0c;我们首先先写四个c文件和相应的h文件&#xff0c;分别是fun0.c,fun1.c,fun2.c,fun0.h,fun1.h,fun2.h以及main.c //fun0.c #include "fun0.h" void print0(){printf("hello world 0"); }//fun0.h #include &l…

Makefile教程(掌握这里足够)

众所周知&#xff0c;在Linux环境下进行项目开发那就少了使用make来构建和管理自己的工程。如果想要更加深入的学习&#xff0c;我在这里推荐一本书 https://www.jianguoyun.com/p/DZWKrLIQjKL5Bxi0z5UD 访问密码&#xff1a;KvhT2v 1. makefile的命名 默认的情况下&#xff…

Makefile 编写教程(由简至难)

目录 一、测试代码二、.c 文件与Makefile同级三、.c文件与Makefile不同级四、链接静态库 一、测试代码 本文以将main.c add.c common.h三个文件编译成一个可执行文件为例&#xff0c;来讲解Makefile的编写。以下是每个文件的代码&#xff08;很简单&#xff0c;测试用&#xf…

好看的vscode字体

vscode下载上面出现的字体(自行百度搜索) (Cascadia Code, 等线)(等线是中文, Cascadia Code是英文, 自认为比较cool的搭配, 也可以自行选择)然后放到C:\Windows\Fonts 会自动安装就完事了~ 欢迎大家关注我的公众号:<前端成长指南> 我会把我的原创作品陆续放在上面

Unity3D中字体样式

字体样式分为三种 系统默认字体 自定义字体&#xff08;包括全部字体&#xff09; 自定义字体&#xff08;不包括全部字体&#xff09;系统默认字体描述优点内存占用小缺点没有艺术效果&#xff0c;没有灵魂 自定义字体&#xff08;包括全部字体&#xff09;描述优点具有一定…

前端HTML字体和文本样式

前端HTML字体和文本样式 文章目录 前端HTML字体和文本样式1.字体样式1.1字体大小1.2 字体粗细1.3 字体样式&#xff08;是否倾斜&#xff09;1.4字体类型1.5 样式层叠问题1.6 字体复合属性 2.文本样式2.1 文本缩进2.2 文本水平对齐方式2.3文本修饰 3.行高 属性表示注意点font-s…

layui表头样式_Layui表格好看样式

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 Layui表格好看样式 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 开发工具与关键技术&#xff1a;web 作者&#xff1a;xq 撰写时间&#xff1a;2019.7.27 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~…

android+字体样式包,android 改变全局字体样式(第三方字体包)

android 改变全局字体样式 参考&#xff1a;http://stackoverflow.com/questions/2711858/is-it-possible-to-set-font-for-entire-application/16883281#16883281 1.将要替换的字体包放到assets下 2.具体代码&#xff1a; //设置新的字体样式 public static void setDefaultFo…

IDEA 修改字体样式

每次发现别人的IDEA字体都是这么好看&#xff0c; 今天这里推荐一款设置方法美化我们IDEA的代码&#xff0c; 代码变漂亮了&#xff0c;写代码也更带劲&#xff01;注意哦这针对的都是windows系统哦&#xff0c;mac系统就不用了&#xff0c;已经很完美了 第一步&#xff1a;下载…

7.20 Web前端-字体样式

今天为大家介绍一下关于字体的相关知识&#xff0c;这里的知识比较简单&#xff0c;因为之前的教学中我们已经接触到了一部分关于字体的知识&#xff0c;在这里我来汇总说一下。 1.长度单位&#xff1a; 长度单位就是你的字体在网页中占用的长度是多少&#xff0c;在web中不是…