Linux 系列距离上一篇文章已经半年多了,因为各种事情一直耽搁到现在,很多小伙伴都问了好些次,一直在等着,感谢大家支持!确实时间拖得太久了,是时候重新加油起来!
简单理了理思路,通过一篇简单点的文章过度一下,上一篇讲到了 Linux 下的 C 编程,本文就要引出 Make 以及 Makefile 了。
嵌入式 Linux 入门系列博文:
嵌入式 Linux 入门(一、Linux 基本介绍及文件结构)
嵌入式 Linux 入门(二、Linux 文件系统、文件类型及权限管理
嵌入式 Linux 入门(三、Linux Shell 及常用命令说明)
嵌入式 Linux 入门(四、Linux 下的编辑器 — 让人爱恨交加的 vi )
嵌入式 Linux 入门(五、Shell 脚本编程上:认识 Shell 脚本)
嵌入式 Linux 入门(六、Shell 脚本编程下:Shell 脚本语法)
嵌入式 Linux 入门 环境篇系列博文:
嵌入式 Linux 入门 环境篇(二、安装虚拟机 — 体验 Ubuntu 22.04)
嵌入式 Linux 入门 环境篇(三、开发板和 PC 的网络互通)
嵌入式 Linux 入门 环境篇(六、搭建 TFTP 环境)
我是矜辰所致,全网同名,尽量用心写好每一系列文章,不浮夸,不将就,认真对待学知识的我们,矜辰所致,金石为开!
在上一篇 Linux 下的 C 编程我们知道了 Linux 下的编译器为 GCC ,以及如何使用 GCC 进行编译,在文章我们讲解 GCC 的编译,使用的只使用了一个 .c 文件,直接使用
gcc [目标文件] -o [想要生产的文件名字]
那在遇到多个 .c 文件的时候如何处理呢?
实际上还是使用上面这条指令,其中的 [目标文件]
是可以为多个的。
举一个简单的例子,我们写了三个.c 文件,内容如下:
编译的方式如下图:
这么看起来是不是感觉还算简单?但是我们可以试想一下,以后做项目的时候,成千上万个文件,怎么办?
我们要考虑2个主要问题:
1、 文件数量多起来了以后如何处理?
2、只修改了单个文件,如何只重新编译修改过后的单个文件?
我们不可能和上面示例一样手动使用 gcc 命令输入文件名的,而且文件多起来了,编译时间需要很长,使用上面示例的命令,是会把所有的文件都重新编译,在后面的 linux 学习开发中,项目的编译时间可比学习 51 、STM32 哪些工程的时候多得太多,每次都编译所有文件这种行为肯定是不可取的。
在 Windows 下面我们有各种集成的 IDE 工具,往往只需要一个按钮,就可以编译整个工程,方便快捷,比如我们熟悉的 Keil,我们只需要点击 IDE 工具栏目的一个按钮,就可以完成我们想要的操作:
那么在 Linux 下,我们该如何处理呢?
这就要用到本文主要说明的东西:Make 工具 和 Makefile 。
首先我们要知道什么是 Make 工具,以及 什么 是 Makefile。
这部分的内容时基本概念,类似名词解释,大家记住就好,没有什么特别需要说明的,因为我们的重点在于知道以及学会他们的使用.
make 工具:
make 本质上它是一个程序,是一个编译工具。我们在后面进行程序的时候,都需要使用 make 命令。
使用 make 工具我们可以自动完成编译工作,而且可以有效的处理我们上面提到的问题:
ls -l
查看的那个时间,make 会根据依赖关系,如果发现依赖的文件修改时间比自己新,那么久会重新编译一下这个依赖文件)利用 make 工具可以将大型的开发项目分解成为多个更易于管理的模块,可以简洁明快地理顺各个源文件之间纷繁复杂的相互关系,大大简化开发工作,避免不必要的重新编译 。
make工具通过一个称为 Makefile 的文件来完成并自动维护编译工作,Makefile文件描述了整个工程的编译、连接规则。
Makefile 文件:
Makefile 是一个文件,是一个描述一系列规则的文件。
Makefile 的 开头 M 要大写!(虽然有的地方说大小写都可以,但是保证大写,是肯定不会有莫名其妙的问题的)。
make 会根据 Makefile 文件的规则规则执行命令,最后完成编译输出 。
在 Makefile 文件中:
这是我们学习 Linux 的一个重点对象,对于新手来说,至少要做到能够看得懂,会一定程度的修改 Makefile 。
实际上 STM32 的开发,我们也可以用到 Make 工具和 Makefile,如果大家目前也在用 STM32 开发,不妨使用 GCC 工具链开发,这样也能提前熟悉 Makefile 。
如果是我的粉丝朋友,一定知道现在我做 STM32 都是使用的 gcc 工具链,具体可查看文章:
抛弃IDE — 在window下使用VScode搭建ARM开发环境
如果想看看简单的 Makefile ,大家可以写一个简单的 STM32 工程,然后在 STM32CubeMX 生成工程的时候选择 Makefile ,如下图:
然后打开工程,就可以看看 ST 工具自动生成的 Makefile 文件了,可以让自己提前熟悉熟悉 Makefile:
经常有小伙伴会被 GCC 与 make 工具搞得糊里糊涂,虽然知道怎么用,但是傻傻分不清楚或者是说不明白。
看清楚概念:GCC 是编译器,make 是一个命令工具。
感觉把概念一说就清楚了啊, GCC 是一个编译 C语言的编译器, 而 make 是一个工具,他可以使得编译工作简化,只不过我们使用的时候 make 会调用 GCC 编译器去完成编译工作。
在 Makefile 中我们会指定执行编译的编译器类型,而且会根据指定的编译器类型进行对应的命令操作,如下图:
因为我们在 linux 下使用的都是 gcc 编译器,所以 Makefile 中的会看到我们熟悉的 gcc 的操作命令,我们只不过是利用 make 工具的自动编译去调用了 gcc 编译器 对工程进行编译。
上面说过,Makefile 是学习 Linux 的一个要点之一,对于 Makefile 说明,我会单独分专栏进行说明介绍,那本文我们刚刚接触,我们写一个简单的 Makefile 来编译文章开头我们示例的3个文件。
直接先写一个傻瓜式的,看看 make 工具是否有用,在示例 .c 文件同目录下,我们新建一个 Makefile 文件,如下:
然后试着使用 make 命令看看效果:
OK,果然可以 make 直接编译,但是上面这个 Makefile 是有问题的,因为每次执行 make ,会把所有的 .c 文件都重新编译器一次,实际使用也不可能这么写。
我们回忆一下上一篇课程的内容,一个C 文件要经过预处理、编译、汇编 和 链接才能变成可执行文件,由不同的 .c
文件生成到不同的 .o
文件,最终才将所有的 .o
文件链接成可执行文件。
所以我们可分开进行,把每一个 .c
先生成 .o
文件,然后再由 所有的 .o
文件生成 最终的文件,这样如果单独修改了某个文件 ,只需要把修改过的 .c
文件重新编译就行了,所以我们的 Makefile 应该这么写:
make 的结果如下:
这样写得好处就是,如果我们只对某一个.c
文件进行修改,他只会对修改过的文件进行重新编译,我们可以测试一下,比如我们修改一下 a.c
文件:
上面这个简单的 Makefile ,大家是不是已经可以感觉到 make 工具的方便快捷了!
本文向大家介绍了一下 Linux 编程时候使用的 make 工具,如何在没有 IDE 工具的 Linux 环境下高效快捷的编译工程,就靠 make 工具了。
当然,我们的重点在于 Makefile,对于 Makefile 的写法规则,更多的内容我会单独写文章说明的。
对于入门的小伙伴来说,也没有必要一蹴而就,写好 Makefile 固然重要,但是对于现在一般的应用开发来说,Makefile 要完全自己从头写得时候不多,很多时候可以找到一个可用的模板进行修改,我们至少要做到可以看懂,可以去修改 Makefile!
全部0条评论
快来发表一下你的评论吧 !