【Linux取经路】基础开发工具——make(一)

简介: 【Linux取经路】基础开发工具——make(一)

a25205cc07c84117911b6b9a894f6ba2.gif

前言:

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

一、认识make和makefile

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

📖makefile带来的好处

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

📖make和makefile

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

📖见见猪跑

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

bd6d877ea4b34976b1d0b2eb543c7e40.png

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

b7748943194e4488a66b1dbd1b458c11.png

使用make。

7e2d4285321147cd9a963350d1c0da7f.png

二、依赖关系和依赖方法

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

📖依赖关系

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 

7203c7a071f7458db81a82731196e152.png

fc75ad7994d44fdc8031ade35cca5d2b.png

从上图可以看出,输入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文件中的依赖方法可以是任意顺序,但是不能缺少。像下面这样,也是可以的。

e1593816e80343289bf5927f75caa7c8.png

这里只是为了演示makefile的自动化推导能力,所以才把编译过程拆解的如此详细,一般我们只需要一个依赖关系和一个依赖方法,就可以完成编译工作。

📖清理生成的文件

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

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

1ab679e8801a4512a9a6066687ec6029.png

📖为什么删除时make后面要加clean

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

📖不能连续编译

如下图,当执行完一次make,对源代码编译后,再去执行make,就不会对源代码重新编译。

a1b76ec268e84f0daea91409848c70f2.png


相关实践学习
CentOS 7迁移Anolis OS 7
龙蜥操作系统Anolis OS的体验。Anolis OS 7生态上和依赖管理上保持跟CentOS 7.x兼容,一键式迁移脚本centos2anolis.py。本文为您介绍如何通过AOMS迁移工具实现CentOS 7.x到Anolis OS 7的迁移。
目录
相关文章
|
2月前
|
Linux 开发工具
【Linux快速入门(二)】Linux与ROS学习之编译基础(make编译)
【Linux快速入门(二)】Linux与ROS学习之编译基础(make编译)
|
5月前
|
Java Linux C++
【Linux】Make和Makefile快速入门
【Linux】Make和Makefile快速入门
35 0
|
5月前
|
NoSQL Linux 开发工具
【linux】在linux操作系统下快速熟悉开发环境并上手开发工具——体验不一样的开发之旅
【linux】在linux操作系统下快速熟悉开发环境并上手开发工具——体验不一样的开发之旅
|
6月前
|
NoSQL Linux 开发工具
【Linux】Linux环境基础开发工具_6
【Linux】Linux环境基础开发工具_6
47 0
|
6月前
|
小程序 Linux 开发工具
【Linux】Linux环境基础开发工具_5
【Linux】Linux环境基础开发工具_5
30 0
|
6月前
|
小程序 Linux 开发工具
【Linux】Linux环境基础开发工具_4
【Linux】Linux环境基础开发工具_4
38 0
|
6月前
|
Linux 开发工具 C语言
【Linux】Linux环境基础开发工具_3
【Linux】Linux环境基础开发工具_3
25 0
|
NoSQL Linux 开发工具
Linux开发工具的使用
1.   Linux开发工具的使用 Vim编译的使用 Gdb调试工具的使用 Makefile的编写 linux跟踪调试 SSH的使用 subversion的使用     1.
1346 0
|
1月前
|
Linux 网络安全 数据安全/隐私保护
Linux 超级强大的十六进制 dump 工具:XXD 命令,我教你应该如何使用!
在 Linux 系统中,xxd 命令是一个强大的十六进制 dump 工具,可以将文件或数据以十六进制和 ASCII 字符形式显示,帮助用户深入了解和分析数据。本文详细介绍了 xxd 命令的基本用法、高级功能及实际应用案例,包括查看文件内容、指定输出格式、写入文件、数据比较、数据提取、数据转换和数据加密解密等。通过掌握这些技巧,用户可以更高效地处理各种数据问题。
92 8
|
1月前
|
监控 Linux
如何检查 Linux 内存使用量是否耗尽?这 5 个命令堪称绝了!
本文介绍了在Linux系统中检查内存使用情况的5个常用命令:`free`、`top`、`vmstat`、`pidstat` 和 `/proc/meminfo` 文件,帮助用户准确监控内存状态,确保系统稳定运行。
251 6