【Linux】基础开发工具——make

这篇具有很好参考价值的文章主要介绍了【Linux】基础开发工具——make。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【Linux】基础开发工具——make,Linux,linux,运维,服务器

前言:

上一期分享了在Linux下编译源代码的两个工具,gcc和g++。每次编译源代码,都要输入一串很长的指令,这个过程显然是十分复杂,且容易出错的,尤其是在一些大型的项目中,源代码可能有多个,此时编译起来就会更费劲。为了解决上面的问题,今天就给大家分享一个,Linux环境下的项目自动化构建工具——make/makefile。

一、认识make和makefile

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

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

📖make和makefile
make是一个命令工具,是一个解释makefile中指令的工具,make是一条命令,makefile是一个文件,两个搭配使用,完成项目的自动化构建。

📖见见猪跑

  • 先在当前目录创建一个makefile文件,m大小写都可以。

【Linux】基础开发工具——make,Linux,linux,运维,服务器

  • 在makefile文件中写入依赖关系和依赖方法。

【Linux】基础开发工具——make,Linux,linux,运维,服务器

  • 使用make。

【Linux】基础开发工具——make,Linux,linux,运维,服务器

二、依赖关系和依赖方法

将一个源文件编译得到可执行文件,这是一件具体的事情。举个例子:月底,你的生活费用完了,于是你就要给你的老爸打电话,告诉他:“老爸,我是你儿子,我没钱啦”。这个过程中,你为什么不给你舍友的父亲打电话呢?哈哈,其实,给你的老爸打电话,说你是他儿子,就叫做表明依赖关系。打了电话,如果什么都没说,把电话挂了,那打电话不就没什么意义,所以让老爸给你打钱,就叫做依赖方法。因此,只有依赖关系加上依赖方法,才能完成打钱这件事情。

📖依赖关系

  • mytest:test.c

同理,对于编译代码这件事情,我们希望把test.c这个源文件,编译得到一个mytest的可执行程序。首先我们要告诉make,要得到mytest这个可执行程序,所依赖的源文件。其中:左边就是我们想要创建的信息,也就是我们想要干的事情,一般也叫做标签,右边就是完成这件事情所依赖的东西,一般都是文件(可以有多个,中间用空格隔开)。

📖依赖方法

  • gcc -o mytest test.c

有了依赖关系,接下来该告诉编译器,要完成这件事情,需要对依赖的文件,执行什么操作。注意:依赖方法前面有一个Tab

三、make工作原理

📖先来看一个完整的编译过程

mytest:test.o
     gcc test.o -o mytest
test.o:test.s
     gcc -c test.s -o test.o
test.s:test.i
     gcc -S test.i -o test.s
test.i:test.c
     gcc -E test.c -o test.i 

【Linux】基础开发工具——make,Linux,linux,运维,服务器
【Linux】基础开发工具——make,Linux,linux,运维,服务器
从上图可以看出,输入make指令以后,它实际执行makefile文件中指令的顺序,和我们写在makefile文件中的指令顺序是反的。这是因为,要得到mytest必须要依赖test.o,但是当前目录下没有test.o这个文件,但是makefile文件中有得到test.o的方法,但是,要得到test.o又必须依赖test.s,但当前目录下依旧没有test.s,以此类推,要先得到test.i文件,才能得到test.s文件,然后才能得到test.o文件,最后才能得到mytest,所以实际指令的执行顺序,于我们在makefile文件中写入的,是反过来的。所以,实际上保存这些依赖关系的是一种栈式的结构。

📖结论
上面说的过程,就叫做makefile依赖关系的自动化推导,由于是自动推导,所以makefile文件中的依赖方法可以是任意顺序,但是不能缺少。像下面这样,也是可以的。

【Linux】基础开发工具——make,Linux,linux,运维,服务器
这里只是为了演示makefile的自动化推导能力,所以才把编译过程拆解的如此详细,一般我们只需要一个依赖关系和一个依赖方法,就可以完成编译工作。

📖清理生成的文件

clean:
	rm -rf test.i test.s test.o mytest

清理编译生成文件的依赖关系和依赖方法,如上所示。清理文件这个操作,不需要依赖任何其他文件,所以:右边的依赖关系什么也没写,直接执行对应的操作,也就是执行依赖方法的指令即可。clean是我用来表示删除操作,自己取的名字,大家也可以根据自己的喜好,取其他的名字。有了上面的依赖关系和依赖方法,此时只需要在命令行中执行make clean指令,就可以把编译过程中产生的文件全删除了。
【Linux】基础开发工具——make,Linux,linux,运维,服务器

📖为什么删除时make后面要加clean
通过上面截图可以看到,在编译源代码的时候,直接用make,但是删除的时候,却要在make后面加上clean。因为,make会自顶向下扫描makefile,单独的make指令,会默认执行第一个依赖方法。

📖不能连续编译
如下图,当执行完一次make,对源代码编译后,再去执行make,就不会对源代码重新编译。
【Linux】基础开发工具——make,Linux,linux,运维,服务器
📖结论
对于一个源代码,进行一次编译,得到一个可执行文件后,如果没有对源代码做任何修改,再去对源代码进行编译,make会觉得没必要,不会重新编译。

📖如何实现
一定是源文件 形成可执行文件,先有源文件,才有可执行文件,一般而言,源文件的最近修改,比可执行文件要早。如果,更改了源文件,那和之前形成的可执行文件相比,此时的源文件最近修改时间就比可执行文件新。

所以,只需要比较可执行文件的最近修改时间和源文件的最近修改时间,如果.out文件的最近修改时间晚于.c文件,就不需要重新编译。反知,则需要重新编译。

📖查看文件时间

  • stat mytest:查看mytest文件的有关时间。

【Linux】基础开发工具——make,Linux,linux,运维,服务器

  • Access:文件最近一次被访问的时间,查看文件内容、修改文件内容,都属于访问文件。
  • Modify:最近一次修改文件内容的时间。
  • Change:最近一次修改文件属性的时间。

这三个时间是相互关联的,有的操作可能会同时更新多个时间。例如:修改文件的内容,那这三个时间都会更新,因为修改文件内容,首先要访问该文件,其次修改后,文件的大小会发生变化,所以这三个时间都会更新。

【Linux】基础开发工具——make,Linux,linux,运维,服务器
如上图所示:修改文件内容,三个时间都更新了,但是修改文件属性,Modify没更新可以理解,为什么Access也没有更新???

正是因为对文件的各种操作,都会导致Access时间改变,早期的Linux系统,确实会随着对文件的操作,时刻更新Access时间,这些时间信息都存储在计算机的硬盘上,而硬盘都属于外部设备,进行读写操作会比较慢,过高频率的更新一个文件的Access,当整个系统在被多个用户使用的时候,就会有大量的Access更新行为,这些行为都会往硬盘中写数据,这就会导致整个系统的运行速度下降。所以,在现在的Linux中,对Access的更新策略进行了修改,维护了一个计数器,会根据Modify和Access的更新达到一定次数的时候,才会更新Access,以此来提高系统的运行效率。(注:不同系统的更新策略会有差异)

📖手动更新文件时间

  • touch test.c:将test.c文件的所有时间更至最新。
  • touch -m test.c:将test.c文件的Modify时间更至最新。
  • touch -a test.c:将test.c文件的Access时间更至最新。
  • touch -c test.c:将test.c文件的Change时间更至最新。

【Linux】基础开发工具——make,Linux,linux,运维,服务器
📖再回到编译
是否重新编译,其实就是比较源文件和可执行文件的Modify时间。

【Linux】基础开发工具——make,Linux,linux,运维,服务器
【Linux】基础开发工具——make,Linux,linux,运维,服务器
📖结论
make会根据源文件和目标文件的新旧,判定是否需要重新执行依赖方法进行编译。这意味着,依赖方法并不是每次都会执行。

📖.PHONY伪目标
要想让makefile文件中的依赖方法总是被执行,可以用.PHONY对相应的标签进行修饰。

.PHONY:mytest                                                                                                                                                                             
mytest:test.c
	gcc test.c -o mytest

告诉make,mytest对应的依赖方法总是被执行。

【Linux】基础开发工具——make,Linux,linux,运维,服务器
上面只是给大家演示.PHONY的作用,一般情况下,对编译操作不加.PHONY进行修饰,而是对清理操作加.PHONY修饰。

mytest:test.c
	gcc test.c -o mytest
.PHONY:clean                                                                                                                                                                              
clean:
	rm -rf mytest

📖特殊符号

  • $@:表示标签,依赖关系冒号左边的内容。
  • $^:表示依赖的文件,依赖关系冒号右边的内容。
mytest:test.c
	gcc $^ -o $@
.PHONY:clean                                                                                                                                                                              
clean:
	rm -rf mytest

📖取消执行make指令时的回显
在前面的介绍中,每次执行make指令,都会把对应的依赖方法回显出来,像下面这样:

【Linux】基础开发工具——make,Linux,linux,运维,服务器
可以在makefile文件中的依赖方法前面加上@,取消回显。

mytest:test.c
	@gcc $^ -o $@
.PHONY:clean                                                                                                                                                                              
clean:
	@rm -rf mytest

【Linux】基础开发工具——make,Linux,linux,运维,服务器
📖一次编译多个可执行文件

.PHONY:all
all:mycommand otherexe

mycommand:mycommand.c
	gcc -o $@ $^
otherexe:otherexe.cc
	g++ -o $@ $^ -std=c++11
.PHONY:clean
clean:
	rm -rf mycommand otherexe

🎁结语:
 今天的分享到这里就结束啦!如果觉得文章还不错的话,可以三连支持一下,您的支持就是春人前进的动力!
【Linux】基础开发工具——make,Linux,linux,运维,服务器文章来源地址https://www.toymoban.com/news/detail-568274.html

到了这里,关于【Linux】基础开发工具——make的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Linux系统化学习】基础开发工具——make和makefile

    ========================================================================= 个人主页点击直达: 小白不是程序媛  Linux学习专栏: Linux系统化学习 ========================================================================= 目录 前言: 初始make和makefile makefile的好处 make和makefile的区别 make和make的使用 依赖关系和依

    2024年02月05日
    浏览(69)
  • 【Linux】Linux环境基础开发工具的使用 ———(yum、vim、gcc&g++、gdb、make/Makefile、进度条 、git)

    (꒪ꇴ꒪(꒪ꇴ꒪ )🐣,我是 Scort 🎓 🌍博客主页:张小姐的猫~江湖背景🌍 快上车🚘,握好方向盘跟我有一起打天下嘞! 送给自己的一句鸡汤🤔: 🔥集中起来的意志可以击穿顽石🔥 🙏作者水平很有限,如果发现错误,可在评论区指正,感谢🙏 🎉🎉欢迎持续关注!🎉🎉

    2024年01月16日
    浏览(53)
  • Linux开发工具Make/Makefile篇

    我们使用gcc/g++编译代码时,每次都要输入一长串的指令,对于单个文件或者文件较少的时候,我们还能接受,可是当文件较多的时候,我们再一个一个编译,就会比较麻烦。Linux中 make 命令加上 Makefile 文件搭配使用,就可以完成项目的自动化构建。 C代码 创建makefile文件 写入

    2024年02月12日
    浏览(34)
  • Linux开发工具大全 - 软件包管理器yum | vim编辑器 | gcc/g++编译器 | 自动化构建工具Make/Makefile | gdb调试工具

    目录 Ⅰ.  Linux 软件包管理器 yum 一、yum 背景知识 二、yum 的基本使用 1、查看软件包 2、软件包名称构成 3、安装软件 4、卸载软件 Ⅱ.vim编辑器  一、认识vim 1、vim概念  2、模式及其切换  二、vim使用 1、vim的指令(重要)  命令模式 插入模式 底行模式 2、vim配置 Ⅲ.gcc/g++编

    2024年02月05日
    浏览(55)
  • Linux基础开发工具之Linux自动项目构建工具的使用

    目录 前言 1.make/makefile 1.1 依赖关系/依赖方法 2.原理 3.项目清理  4.make的执行问题  5.相关简单的符号介绍 总结   之前给大家介绍了我们在开发过程中所需要使用到的编辑器vim,以及编译器gcc/g++的使用,但是我相信大家在使用过程会发现我们在每次编写好一份代码时总是需

    2024年02月13日
    浏览(44)
  • 【Linux】基础开发工具——vim篇

    前言:  今天给大家分享的工具是 vim 。vim是一款强大的 文本编辑器 ,他有多种编辑模式,所以也叫 多模式编辑器 ,它的前身是vi。vim兼容vi的所有指令,并且在vi的基础上添加了一些新的特性。例如:语法加亮、可视化操作也可以运行在x windows、mac os、windows。  先给大家

    2024年02月12日
    浏览(38)
  • 【Linux】基础开发工具——yum篇

     在Windows环境下,我们通常会到对应的官网,去下载安装包进行软件的安装,在手机端,我们通常会到应用商店去下载我们需要的软件。那在Linux环境下如何安装软件呢?  源代码安装,即软件的开发者把软件的源代码直接给我们,我们自己对源代码进行编译、安装。源代码

    2024年02月12日
    浏览(46)
  • linux中基础开发工具的使用

    1.linux中的软件包管理器 1.1什么是软件包 在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序.但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安装程序)放在一个服务器上, 通过包管理器可以很

    2024年02月02日
    浏览(63)
  • 【Linux】基础开发工具使用 --- gcc

    目录 预处理 编译 汇编 链接 函数库 协助记忆 🧋GCC(GNU Compiler Collection)是由GNU开发的编程语言编译器。GNU编译器套件包括C、C++、 Objective-C、 Fortran、Java、Ada和Go语言前端,也包括了这些语言的库(如libstdc++,libgcj等。),说那么多就是一个编译器。平时写完的程序就是需

    2024年02月03日
    浏览(46)
  • Linux环境基础开发工具使用(二)

    📘北尘_ :个人主页 🌎个人专栏 :《Linux操作系统》《经典算法试题 》《C++》 《数据结构与算法》 ☀️走在路上,不忘来时的初心 会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力。 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个

    2024年02月05日
    浏览(66)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包