【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


目录
相关文章
|
1月前
|
算法 数据可视化 Linux
Linux内核编译:深入理解`make menuconfig`命令
Linux内核编译:深入理解`make menuconfig`命令
32 0
|
1月前
|
编译器 Linux 数据库
Linux--gcc与make
Linux--gcc与make
|
23天前
|
搜索推荐 NoSQL Linux
Linux开发工具——vim篇
Linux开发工具——vim篇
|
23天前
|
Ubuntu Linux 编译器
【Linux】4. 开发工具的使用(yum/vim)
【Linux】4. 开发工具的使用(yum/vim)
44 2
|
1月前
|
IDE Linux 编译器
【Linux】项目自动化构建工具 —— make/Makefile
【Linux】项目自动化构建工具 —— make/Makefile
|
7天前
|
Linux 开发工具 C语言
【linux基础(七)】Linux中的开发工具(下)--make/makefile和git
【linux基础(七)】Linux中的开发工具(下)--make/makefile和git
|
7天前
|
人工智能 数据可视化 Linux
【linux基础(五)】Linux中的开发工具(上)---yum和vim
【linux基础(五)】Linux中的开发工具(上)---yum和vim
|
NoSQL Linux 开发工具
Linux开发工具的使用
1.   Linux开发工具的使用 Vim编译的使用 Gdb调试工具的使用 Makefile的编写 linux跟踪调试 SSH的使用 subversion的使用     1.
1325 0
|
23小时前
|
Linux Shell 开发工具
【Linux】:文本编辑与输出命令 轻松上手nano、echo和cat
【Linux】:文本编辑与输出命令 轻松上手nano、echo和cat
8 0
|
1天前
|
Linux 数据安全/隐私保护
Linux常用命令大全:一杯水时间让你掌握!(附目录和快捷键)(下)
Linux常用命令大全:一杯水时间让你掌握!(附目录和快捷键)
9 2

热门文章

最新文章