前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Linux项目自动化构建工具-make/Makefile

Linux项目自动化构建工具-make/Makefile

作者头像
南桥
发布于 2025-05-22 04:49:28
发布于 2025-05-22 04:49:28
24100
代码可运行
举报
文章被收录于专栏:南桥谈编程南桥谈编程
运行总次数:0
代码可运行

前言

makefile有什么用?本篇文章小编将详细介绍

会不会写makefile,从侧面说明一个人具不具备完成大型工程的能力

一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作

makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。

make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。

make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。

快速见识一下

实例代码:

首先创建一个code.c文件,在该文件中写一个测试代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 #include<stdio.h>

 int main()
 {
   printf("hello gwj!\n");                                                                                                               
   return 0;
 }

创建一个makefile文件:

使用vim指令,进入makefile

使用如下代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mytest:code.c
   gcc -o mytest code.c

保存并退出

使用make指令,可直接生成mytest运行文件

清除操作:

进入makefile文件,使用如下指令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.PHONY:clear
 clear:
   rm -f mytest  

保存并退出后,使用make clear指令可删除mytest运行文件

以上代码实例快速感受一下make指令

说明原理

make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。

依赖关系和依赖方法

mytest:code.c称之为依赖关系

mytest是目标文件,使用make命令后,生成的运行文件叫mytest

code.c是依赖文件列表,如果有多个时使用空格符隔开,例如:code.c code1.c code2.c code3.c

gcc -o mytest code.c称之为依赖关系,前面必须是Tab键开头,不能是四个空格

此时,makefile写好之后,运行make,会在当前目录里找makefile,读取makefile里的内容,根据依赖关系去形成目标文件。如何去形成呢?根据gcc这样的一个依赖方法形成。 换句话来说就是,make会读取makefile里面的内容

如何理解依赖关系和依赖方法

- 什么是依赖关系?? 在大学,到了月底,身为尾款人的你打电话给你爹要点生活费:“爹,我是你儿子!” 这句话中,“我是你儿子”表明了两人的关系,表明你需要依赖于你爹,这就是一个依赖关系。

- 什么是依赖方法?? 此时呢,你爹就把电话挂了,心想:是我儿子就是我儿子呗,有病吧。现实生活中,光有依赖关系没有用,需要表明你想做什么,此时你又把电话打回去:“我没有生活费啦,给我打钱!” 这里的要钱就是表明了依赖方法

项目清理

clear是一个种特殊的依赖关系,clear也是目标文件,只不过后面什么都不跟

rm -f mytest是依赖方法,是删除文件

如何理解.PHONY:

在读取makefile文件内容时,是从上往下读取,默认认形成第一个目标文件

习惯上把形成可执行程序放在上面,make就可以直接形成

在编译时,默认情况下,如果可执行程序是最新的了,make就不会再去编译,如果就想让编译这个操作总是可以被执行,使用.PHONY:XXX,这里的XXX对应的方法总是可以被执行的。

一般清理项目会总是执行,因此习惯上会有:.PHONY:clear

为什么makefile对最新的可执行程序默认不想重新生成

如果项目种存在很多个源文件,如果在这些源文件中只进行了很小的改变,如果去把所有的源文件重新编译一遍,会带来很大的效率延缓,效率很低。更重要的是,如果每次都重新编译,源代码可能都没有改,重新去编译效率会很低。

这要做的主要目的是提高编译效率。

makefile怎么知道程序需要重新编译?

Modify是修改时间,可执行文件和源代码文件最近修改时间不可能一样 因为永远是先写源代码,即使修改代码,也是先修改,再形成可执行程序。

因此,makefile只需对比可执行文件最近修改时间和源文件最近修改时间,如果可执行文件最近修改时间新,就不需要重新编译;如果源文件最近修改时间新,就需要重新编译。

如果被.PHONY:修饰,就忽略了时间,于是可以总是被执行

我们想需要的makefile

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
code.exe:code.c
  gcc -o $@ $^

@@表示取code.exe文件,

make时会自动替换成gcc -o code.exe code.c

make会根据文件的依赖关系,进行自动推导,帮助我们执行所有相关依赖方法。当前的依赖关系如果不存在,就将当前依赖关系入栈,如果下一个依赖关系存在导致当前依赖关系存在,则当前依赖关系出栈,这里就相当于一个递归。

最终需要的目标文件一定要在第一个,后面的可以乱

我们自己在使用makefile时没必要像上述代码那样写,没必要纠结那么多选项,直接可以这样写:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
code.exe:code.c
  gcc -o $@ $^

使用变量替换:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  1 bin=code.exe
  2 src=code.c
  3 
  4 $(bin):$(src)
  5   gcc -o $@ $^
  6 .PHONY:
  7 clean:
  8   rm -f $(bin)

此时照样可以编译,在makefile中是可以定义变量的

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-02-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【Linux】自动化构建工具-make/Makefile
在上一篇中已经了解了【Linux】编译器-gcc/g++使用,这次来一起看看make/Makefile。
zxctscl
2024/03/21
1780
【Linux】自动化构建工具-make/Makefile
【Linux探索学习】第九弹——Linux工具篇(四):项目自动化构建工具—make/Makefile
Linux笔记:https://blog.csdn.net/2301_80220607/category_12805278.html?spm=1001.2014.3001.5482
GG Bond1
2024/10/31
980
【Linux探索学习】第九弹——Linux工具篇(四):项目自动化构建工具—make/Makefile
【linux篇】动静态库和自动化构建的“神之一手”:make、Makefile
在创建一个Makefile文件,里面写入如下代码。表示mycode文件依赖于code.c,下面就是正常的gcc编译
用户11456817
2025/05/28
1770
【linux篇】动静态库和自动化构建的“神之一手”:make、Makefile
【Linux修炼手册】Linux开发工具的使用(二):gcc/g++与make/makefile
我们都知道,头文件.h中提供的是方法声明。那么,真正的方法在哪里呢? 没错,就是在库中: 头文件 + 库 + 你的代码 = 你的软件
我想吃余
2025/05/13
1020
【Linux修炼手册】Linux开发工具的使用(二):gcc/g++与make/makefile
【Linux】Linux项目自动化构建工具——make/Makefile
1. makefile文件既可以写成makefile,也可以写成Makefile
举杯邀明月
2023/04/12
9250
【Linux】Linux项目自动化构建工具——make/Makefile
【Linux系统编程】Linux项目自动化构建工具——make/Makefile
make和makefile提供了自动化构建的能力,可以根据源文件的依赖关系和规则自动决定哪些文件需要重新编译。而直接使用gcc需要手动指定每个源文件的编译命令,不具备自动化的构建功能。
YIN_尹
2024/01/23
3560
【Linux系统编程】Linux项目自动化构建工具——make/Makefile
Linux项目自动化构建工具-make/Makefile
当多个源文件编译形成可执行程序时,只对其中的一两个文件进行修改时,重新编译源文件时,是全部重新编译还是编译部分?
绝活蛋炒饭
2024/12/16
1200
Linux项目自动化构建工具-make/Makefile
Linux项目中自动化构建工具-make/Makfile
难道说每次C语言代码写好之后都需要去编写gcc命令,如果有上百个文件去构建的话,那不得麻烦死了。所以有没有简单的做法呢?有!答案就是make/Makefile。
薛定谔方程难
2024/07/27
1210
Linux项目中自动化构建工具-make/Makfile
Linux自动化构建-make/Makefile
查看状态, 我们可以看到以下三个时间。 文件 = 内容 + 属性 以下简称acm时间, a表示最近一次访问的时间, M表示内容最近被修改的时间, C表示最近一个属性被修改的时间。 例如 : cat proc.c就是访问文件(但是访问频繁影响效率, 现在的操作系统已经这一块已经发生了变化。) chmod o-r proc.c 就是改变属性 vim proc.c 就是修改内容
用户11317877
2024/12/20
1300
Linux自动化构建-make/Makefile
【Linux】初步使用makefile
makefile 可以实现自动化构建代码工程 首先 来认识一下make makefile
叫我龙翔
2024/02/17
2090
【Linux】初步使用makefile
【Liunx篇】基础开发工具-自动化构建-make/Makefile
 上一章节我们已经了解到了编译器gcc/g++以及动静态库的相关知识,在本章里我将给大家介绍make/Makefile。平时我们在代码编译的时候采用的是gcc/g++来编译,我们编译一个源文件总是要写gcc编译命令,而且每次编译都需要我们去写,这样去写就大大的降低了我们的效率,能不能自动地将我们的代码编译形成可执行呢?答案是可以的,下来我将给大家来介绍自动化构建-make/Makefile。
_孙同学
2024/12/25
1170
【Liunx篇】基础开发工具-自动化构建-make/Makefile
深入了解Linux —— make和makefile自动化构建工具
make是一个命令工具,是一个解释makefile在指令的命令工具,大多数的IDE都存在这个命令。
星辰与你
2024/12/29
4670
深入了解Linux —— make和makefile自动化构建工具
Linux:编译,链接,自动化构建工具
我们发现这次处理后的代码,就已经是我们看不懂的了,这就是已经从C代码转换为了汇编代码;
啊QQQQQ
2024/11/19
900
Linux:编译,链接,自动化构建工具
Linux项目自动化构建工具-make/Makefile
会不会写 makefile ,从一个侧面说明了一个人是否具备完成大型工程的能力
用户10923087
2024/02/02
1490
Linux项目自动化构建工具-make/Makefile
linux自动化构建工具--make/makefile
make是一个指令,makefile是一个文件(Makefile也是一样的,两个实际上就是一个东西,M大小写都没有影响),这个是我们首先应该意识到的问题;
阑梦清川
2025/02/24
910
linux自动化构建工具--make/makefile
快速上手makefile自动化构建工具
  在windows下,很多东西都是编译器直接帮你做好的,而在Linux下并不是这样,如果也想要实现自动化,就要会写makefile,那么话不多说,开启我们今天的话题!
用户11029129
2024/06/04
1720
【Linux】gcc/g++的使用 自动化构建工具make/makefile的使用
所以我们现在要使用gcc编译生成可执行文件时,只需一次性把代码写到makefile文件里,在使用make命令就可以一件生成了,省去了重复写的麻烦,并且这个make是递归式生成的,所以写依赖关系和依赖方法时,不用担心顺序的问题。
aosei
2024/01/23
4650
【Linux】gcc/g++的使用 自动化构建工具make/makefile的使用
Linux项目自动化构建工具-make/Makefile
一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作。
青衫哥
2023/03/31
8050
Linux项目自动化构建工具-make/Makefile
make、Makefile项目自动化构建工具
这里简单举个例子,假如我想要对一个test.c源文件进行编译,最终生成一个mytest的可执行程序,那么我们就可以说mytest与test.c互为依赖关系。mytest的生成需要依赖test.c这个源文件。两者之间用冒号:进行连接。(我们的依赖关系可以为n个,n>=0)
诺诺的包包
2023/02/27
1K0
make、Makefile项目自动化构建工具
自动化构建与进度显示:全面解读 make 与 Makefile
make 是一个自动化构建工具,通过解析 makefile 文件中的规则,管理项目的构建流程。它的主要功能是根据源文件的修改情况,自动更新目标文件,避免手动输入复杂的编译命令。
HZzzzzLu
2024/12/26
2720
自动化构建与进度显示:全面解读 make 与 Makefile
推荐阅读
相关推荐
【Linux】自动化构建工具-make/Makefile
更多 >
LV.1
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档