嵌入式 Linux 入门(十一、make 和 MakeFile)

这篇具有很好参考价值的文章主要介绍了嵌入式 Linux 入门(十一、make 和 MakeFile)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

嵌入式 Linux 入门第十一课,Make 工具和 Makefile 的引入...... 矜辰所致

前言

Linux 系列距离上一篇文章已经半年多了,因为各种事情一直耽搁到现在,很多小伙伴都问了好些次,一直在等着,感谢大家支持! 确实时间拖得太久了,是时候重新加油起来!

简单理了理思路,通过一篇简单点的文章过度一下,上一篇讲到了 Linux 下的 C 编程,本文就要引出 Make 以及 Makefile 了。

❤️ 嵌入式 Linux 入门系列博文:
嵌入式 Linux 入门(一、Linux 基本介绍及文件结构)
嵌入式 Linux 入门(二、Linux 文件系统、文件类型及权限管理)
嵌入式 Linux 入门(三、Linux Shell 及常用命令说明)
嵌入式 Linux 入门(四、Linux 下的编辑器 — 让人爱恨交加的 vi )
嵌入式 Linux 入门(五、Shell 脚本编程上:认识 Shell 脚本)
嵌入式 Linux 入门(六、Shell 脚本编程下:Shell 脚本语法)
嵌入式 Linux 入门(七、Linux 下的环境变量)
嵌入式 Linux 入门(八、Linux 下的软件安装)
嵌入式 Linux 入门(九、Linux 下的磁盘管理)
嵌入式 Linux 入门(十、Linux 下的 C 编程)
.
嵌入式 Linux 环境搭建系列博文:嵌入式 Linux 环境篇
.
我是矜辰所致,全网同名,尽量用心写好每一系列文章,不浮夸,不将就,认真对待学知识的我们,矜辰所致,金石为开!

一、Linux 下多文件编译

在上一篇 Linux 下的 C 编程我们知道了 Linux 下的编译器为 GCC ,以及如何使用 GCC 进行编译,在文章我们讲解 GCC 的编译,使用的只使用了一个 .c 文件,直接使用

gcc [目标文件] -o [想要生产的文件名字]

那在遇到多个 .c 文件的时候如何处理呢?

实际上还是使用上面这条指令,其中的 [目标文件] 是可以为多个的。

举一个简单的例子,我们写了三个.c 文件,内容如下:

嵌入式 Linux 入门(十一、make 和 MakeFile)

编译的方式如下图:

嵌入式 Linux 入门(十一、make 和 MakeFile)

这么看起来是不是感觉还算简单?但是我们可以试想一下,以后做项目的时候,成千上万个文件,怎么办?

我们要考虑2个主要问题:

1、 文件数量多起来了以后如何处理?

2、只修改了单个文件,如何只重新编译修改过后的单个文件?

我们不可能和上面示例一样手动使用 gcc 命令输入文件名的,而且文件多起来了,编译时间需要很长,使用上面示例的命令,是会把所有的文件都重新编译,在后面的 linux 学习开发中,项目的编译时间可比学习 51 、STM32 哪些工程的时候多得太多,每次都编译所有文件这种行为肯定是不可取的。

在 Windows 下面我们有各种集成的 IDE 工具,往往只需要一个按钮,就可以编译整个工程,方便快捷,比如我们熟悉的 Keil,我们只需要点击 IDE 工具栏目的一个按钮,就可以完成我们想要的操作:

嵌入式 Linux 入门(十一、make 和 MakeFile)

那么在 Linux 下,我们该如何处理呢?

这就要用到本文主要说明的东西: Make 工具 和 Makefile 。

二、make 工具和 Makefile

首先我们要知道什么是 Make 工具,以及 什么 是 Makefile。

这部分的内容时基本概念,类似名词解释,大家记住就好,没有什么特别需要说明的,因为我们的重点在于知道以及学会他们的使用.

2.1 make 和 Makefile 是什么?

make 工具:

make 本质上它是一个程序,是一个编译工具。我们在后面进行程序的时候,都需要使用 make 命令。

使用 make 工具我们可以自动完成编译工作,而且可以有效的处理我们上面提到的问题:

  1. 多个文件的自动编译;
  2. 每次执行 make 命令,只重新编译修改后的文件;
    .
    这里提一句,Linux 是如何判断文件是否有修改: 文件的修改时间!就是通过 ls -l 查看的那个时间,make 会根据依赖关系,如果发现依赖的文件修改时间比自己新,那么久会重新编译一下这个依赖文件)

利用 make 工具可以将大型的开发项目分解成为多个更易于管理的模块,可以简洁明快地理顺各个源文件之间纷繁复杂的相互关系,大大简化开发工作,避免不必要的重新编译 。

make工具通过一个称为 Makefile 的文件来完成并自动维护编译工作,Makefile文件描述了整个工程的编译、连接规则。

Makefile 文件:

Makefile 是一个文件,是一个描述一系列规则的文件。

Makefile 的 开头 M 要大写!(虽然有的地方说大小写都可以,但是保证大写,是肯定不会有莫名其妙的问题的)。

make 会根据 Makefile 文件的规则规则执行命令,最后完成编译输出 。

在 Makefile 文件中:

  • 定义一系列的规则来制定源文件编译后的先后顺序
  • 特定的语法规则、支持函数定义、函数调用
  • 能直接集成操作系统中的命令

这是我们学习 Linux 的一个重点对象,对于新手来说,至少要做到能够看得懂,会一定程度的修改 Makefile 。

2.2 通过 STM32 提前熟悉 Makefile

实际上 STM32 的开发,我们也可以用到 Make 工具和 Makefile,如果大家目前也在用 STM32 开发,不妨使用 GCC 工具链开发,这样也能提前熟悉 Makefile 。

如果是我的粉丝朋友,一定知道现在我做 STM32 都是使用的 gcc 工具链,具体可查看文章:

在window下使用 VScode 搭建 ARM 开发环境

如果想看看简单的 Makefile ,大家可以写一个简单的 STM32 工程,然后在 STM32CubeMX 生成工程的时候选择 Makefile ,如下图:

嵌入式 Linux 入门(十一、make 和 MakeFile)

然后打开工程,就可以看看 ST 工具自动生成的 Makefile 文件了,可以让自己提前熟悉熟悉 Makefile:

嵌入式 Linux 入门(十一、make 和 MakeFile)

2.3 GCC 与 make 的关系/区别?

经常有小伙伴会被 GCC 与 make 工具搞得糊里糊涂,虽然知道怎么用,但是傻傻分不清楚或者是说不明白。

看清楚概念: GCC 是编译器,make 是一个命令工具。

感觉把概念一说就清楚了啊, GCC 是一个编译 C语言的编译器, 而 make 是一个工具,他可以使得编译工作简化,只不过我们使用的时候 make 会调用 GCC 编译器去完成编译工作。

在 Makefile 中我们会指定执行编译的编译器类型,而且会根据指定的编译器类型进行对应的命令操作,如下图:

嵌入式 Linux 入门(十一、make 和 MakeFile)

因为我们在 linux 下使用的都是 gcc 编译器,所以 Makefile 中的会看到我们熟悉的 gcc 的操作命令,我们只不过是利用 make 工具的自动编译去调用了 gcc 编译器 对工程进行编译。

三、一个简单的 Makefile

上面说过,Makefile 是学习 Linux 的一个要点之一,对于 Makefile 说明,我会单独分专栏进行说明介绍,那本文我们刚刚接触,我们写一个简单的 Makefile 来编译文章开头我们示例的3个文件。

直接先写一个傻瓜式的,看看 make 工具是否有用,在示例 .c 文件同目录下,我们新建一个 Makefile 文件,如下:

嵌入式 Linux 入门(十一、make 和 MakeFile)

然后试着使用 make 命令看看效果:

嵌入式 Linux 入门(十一、make 和 MakeFile)

OK,果然可以 make 直接编译,但是上面这个 Makefile 是有问题的,因为每次执行 make ,会把所有的 .c 文件都重新编译器一次,实际使用也不可能这么写。

我们回忆一下上一篇课程的内容,一个C 文件要经过预处理、编译、汇编 和 链接才能变成可执行文件,由不同的 .c 文件生成到不同的 .o 文件,最终才将所有的 .o 文件链接成可执行文件。

所以我们可分开进行,把每一个 .c 先生成 .o 文件,然后再由 所有的 .o 文件生成 最终的文件,这样如果单独修改了某个文件 ,只需要把修改过的 .c 文件重新编译就行了,所以我们的 Makefile 应该这么写:
嵌入式 Linux 入门(十一、make 和 MakeFile)

make 的结果如下:

嵌入式 Linux 入门(十一、make 和 MakeFile)

这样写得好处就是,如果我们只对某一个.c 文件进行修改,他只会对修改过的文件进行重新编译,我们可以测试一下,比如我们修改一下 a.c 文件:

嵌入式 Linux 入门(十一、make 和 MakeFile)

上面这个简单的 Makefile ,大家是不是已经可以感觉到 make 工具的方便快捷了!

结语

本文向大家介绍了一下 Linux 编程时候使用的 make 工具,如何在没有 IDE 工具的 Linux 环境下高效快捷的编译工程,就靠 make 工具了。

当然,我们的重点在于 Makefile,对于 Makefile 的写法规则,更多的内容我会单独写文章说明的。

对于入门的小伙伴来说,也没有必要一蹴而就,写好 Makefile 固然重要,但是对于现在一般的应用开发来说,Makefile 要完全自己从头写得时候不多,很多时候可以找到一个可用的模板进行修改,我们至少要做到可以看懂,可以去修改 Makefile!

好了,本文就到这里,谢谢大家!文章来源地址https://www.toymoban.com/news/detail-457127.html

到了这里,关于嵌入式 Linux 入门(十一、make 和 MakeFile)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【ARM 嵌入式 编译 Makefile 系列 2 - Makefile 如何打印信息】

    请阅读 【ARM GCC Makefile 编译专栏导读】 下篇文章:【ARM 嵌入式 编译 Makefile 系列 2.1 - Makefile info,warn, error 打印详细介绍】 上篇文章:【ARM 嵌入式 编译 Makefile 系列 1 - Makefile 如何调用 shell 脚本】 在Makefile中,我们可以使用echo命令来打印信息。这种方法适用于大多数的 UNI

    2024年02月12日
    浏览(50)
  • 【ARM 嵌入式 编译 Makefile 系列 16 - Makefile 伪目标.PHONY 与 FORCE 详细介绍】

    请阅读 【ARM GCC Makefile 编译专栏导读】 .PHONY 是GNU make的一个特殊目标,它用来指定那些不产生文件的目标。如果一个目标被声明为 .PHONY ,那么make命令会忽略这个目标的文件名,即使在文件系统中存在同名的文件,make命令也会每次都执行这个目标的命令 在 Makefile 中, 目标

    2024年02月12日
    浏览(43)
  • 嵌入式 Linux 入门(一、Linux 基本介绍及文件结构)

    学习嵌入式 Linux,首先我们得知道什么是Linux,什么是嵌入式Linux,有一些基本概念就先得先了解。 基本的说明介绍完,我们第一篇先来了解一下 Linux 的文件结构。 本文就简单的说明一些必要的基本概念,以及介绍一下 Linux 的文件结构。但是呢,既然是自己写博文,除非专

    2024年04月13日
    浏览(45)
  • 实时嵌入式Linux设备基准测试快速入门1介绍

    工业4.0已经到来,生产线需要新技术来应对客户日益增长的新功能需求,使用配备嵌入式 Linux 的单板计算机来处理所需的许多功能是大势所趋。这样大多数工业控制系统都需要实时性能,开发人员不得不面对这样一个事实:Linux原本并不适用于实时环境。不过多年来很多人都

    2024年02月15日
    浏览(40)
  • 嵌入式C编译工具:gcc/make/Autotools/cmake

    gcc时GNU编译套件,一种编译器,可以编译c,c++,java等语言。当只有一个文件时,使用gcc编译器就很方便,但是当有多个文件时,编译顺序以及包含关系等使用gcc很麻烦。 make工具:make就相当于一个智能的批处理工具,通过调用makefile实现编译,在makefile规定编译以及链接的顺序

    2024年02月02日
    浏览(52)
  • 实时嵌入式Linux设备基准测试快速入门4测试和测量

    本章将介绍主要测试方案及其具体配置和结果。在介绍实际测量结果之前,将尽可能总结被测设备的特性。最后,将对结果进行分析,并概述由于高速缓存一致性问题造成的延迟方面的主要瓶颈,提出减少延迟的解决方案,并解释用于发现和缓解问题的方法。 用于智能设备的

    2024年02月15日
    浏览(42)
  • 【嵌入式Qt开发入门】初识Qt——Linux下安装Qt

            Qt 是一个跨平台的 C++开发库。主要用来开发图形用户界面(Graphical User Interface,简 称 GUI)程序。         Qt 虽然经常被当做一个 GUI 库,用来开发图形界面应用程序,但这并不是 Qt 的全部; Qt 除了可以绘制漂亮的界面(包括控件、布局、交互),还包含很多

    2024年02月16日
    浏览(59)
  • 【C语言】嵌入式C语言项目管理利器:深入理解Makefile的应用与实践

    目录 一、makedile的概述 1、案例引入 2、makefile  3、Makefile优点 二、makefile的语法规则  1、语法规则 2、简单实战 三、makefile的变量 1、自定义变量 2、系统环境变量 3、预定义变量 4、高级makefile gcc a.c b.c c.c ‐o main 如果只修改了b.c 使用gcc编译 需要对所有文件重新编译。makefi

    2024年02月15日
    浏览(54)
  • Linux嵌入式学习之Ubuntu入门(二)磁盘文件介绍及分区、格式化等

    Linux嵌入式学习之Ubuntu入门(一)基本命令、软件安装、文件结构、编辑器介绍 Linux嵌入式学习之Ubuntu入门(二)磁盘文件介绍及分区、格式化等 Linux嵌入式学习之Ubuntu入门(三)用户、用户组及文件权限 Linux嵌入式学习之Ubuntu入门(四)Makefile Linux嵌入式学习之Ubuntu入门(五

    2023年04月11日
    浏览(70)
  • 基于ubuntu的STM32嵌入式软件开发(四)——应用软件工程的修改、Makefile及编译脚本的编写

            本文主要介绍基于标准库函数移植的STM32的应用软件工程的修改,主要涉及到文件内容修改、Makefile文件编写、编译脚本编写等内容,其中编译脚本是基于arm-none-eabi-gcc的交叉编译器撰写的。程序亲测可以正常编译,生成.bin和.hex的可烧录镜像文件。 1.首先修改 pr

    2023年04月15日
    浏览(46)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包