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

news2024/12/23 15:51:50
嵌入式 Linux 入门第十一课,Make 工具和 Makefile 的引入...... 矜辰所致

目录

  • 前言
  • 一、Linux 下多文件编译
  • 二、make 工具和 Makefile
    • 2.1 make 和 Makefile 是什么?
    • 2.2 通过 STM32 提前熟悉 Makefile
    • 2.3 GCC 与 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 文件,内容如下:

在这里插入图片描述

编译的方式如下图:

在这里插入图片描述

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

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

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

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

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

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

在这里插入图片描述

那么在 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 ,如下图:

在这里插入图片描述

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

在这里插入图片描述

2.3 GCC 与 make 的关系/区别?

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

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

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

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

在这里插入图片描述

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

三、一个简单的 Makefile

上面说过,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!

好了,本文就到这里,谢谢大家!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/560383.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

〖Python网络爬虫实战㉙〗- Selenium案例实战(三)

订阅:新手可以订阅我的其他专栏。免费阶段订阅量1000 python项目实战 Python编程基础教程系列(零基础小白搬砖逆袭) 说明:本专栏持续更新中,目前专栏免费订阅,在转为付费专栏前订阅本专栏的,可以免费订阅付…

OpenGL之着色器

文章目录 什么是着色器数据类型输入与输出Uniform三角形渐变色例子从文件中读取 什么是着色器 着色器是使用一种叫GLSL的类C语言写成的。GLSL是为图形计算量身定制的,它包含一些针对向量和矩阵操作的有用特性。着色器的开头总是要声明版本,接着是输入和输…

攻击面管理有多重要?从一个社工钓鱼的仿冒网站说起

2023年4月中旬,A企业紧锣密鼓地展开了重保前期的筹备。A企业是一家集团公司,业务范围广,资产众多,为了提前了解自身安全情况,探知未知风险,公司通过自身资产清单及配套手段对自身资产暴露情况进行了梳理。 …

总结springboot项目中一些后端接收前端传参的方法

文章目录 1、java方法入参里面什么注解都没有2、不使用&#xff1f;&来拼接参数&#xff0c;在参数中添加PathVariable注解3、RequestBody 先创建一个springboot项目&#xff0c;并在pom文件中添加web依赖&#xff1a; <dependency><groupId>org.springframewo…

Linux:LVM动态磁盘管理

Linux中的LVM是什么 LVM&#xff08;Logical Volume Manager&#xff09;是Linux系统中的一种动态分区技术&#xff0c;它允许将多个物理硬盘上的存储空间组合成一个或多个逻辑卷&#xff08;Logical Volume&#xff09;&#xff0c;并且可以在运行时对逻辑卷进行调整。LVM的设…

Unity UI -- (7) 创建世界空间UI

目前为止&#xff0c;我们已经设计了一个屏幕空间UI&#xff08;Screen Space UI&#xff09;。一个屏幕空间UI会在屏幕上平坦放置&#xff0c;它会被渲染到环境中所有东西的上面&#xff0c;无论相机位置在哪里。 而一个世界空间UI&#xff08;World Space UI&#xff09;能够…

什么是半实物仿真平台自动驾驶半实物仿真平台有哪些?

文章目录 半实物仿真平台介绍自动驾驶半实物仿真平台介绍1.CARLA2.AirSim3.LGSVL Simulator 半实物仿真平台介绍 半实物仿真平台是一种综合利用虚拟仿真和实际硬件设备的仿真系统。它将虚拟环境和真实硬件设备结合起来&#xff0c;旨在提供更真实、更准确的仿真体验。 在半实…

Hack The Box真实靶机环境搭建教程

Hack The Box真实靶机环境搭建教程 1.开启测试靶机的方法2.Windows连接HTB3.Kali连接HTB 1.开启测试靶机的方法 在机器列表中选择一台主机&#xff1a; 选择加盟主机&#xff1a; 靶机开启成功&#xff1a; 2.Windows连接HTB 下载安装OpenVPN&#xff1a; 下载VPN&#xff08…

Linux---文本处理命令(grep、wc、管道符 |)

1. grep命令 grep命令能够在一个或多个文件中&#xff0c;搜索某一特定的字符模式&#xff08;也就是正则表达式&#xff09;&#xff0c;此模式可以 是单一的字符、字符串、单词或句子。 注意&#xff1a;在基本正则表达式中&#xff0c;如通配符 *、、{、|、( 和 )等&#…

【STM32G431RBTx】备战蓝桥杯嵌入式→决赛试题→第十三届

文章目录 前言一、题目二、模块初始化三、代码实现interrupt.h:interrupt.c:main.h:main.c: 四、完成效果五、总结 前言 无 一、题目 二、模块初始化 1.LCD这里不用配置&#xff0c;直接使用提供的资源包就行 2.ADC:开启ADCsingle-ended 3.LED:开启PC8-15,PD2输出模式就行了…

从前序与中序遍历序列构造二叉树(java)

从前序与中序遍历序列构造二叉树 leetcode 105 题-原题链接题目描述解题思路往期经典二叉树递归题目&#xff1a; leetcode 105 题-原题链接 从前序与中序遍历序列构造二叉树 题目描述 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&a…

【论文阅读系列】NWD-Based Model | 小目标检测新范式,抛弃IoU-Based暴力涨点(登顶SOTA) 计算机视觉

NWD-Based Model | 小目标检测新范式&#xff0c;抛弃IoU-Based暴力涨点(登顶SOTA) 计算机视觉 参考&#xff1a;博客1 知乎2 在这里进行纪录分享&#xff0c;这是有用的资料&#xff0c;避免之后再寻找相当麻烦。 小目标检测是一个非常具有挑战性的问题&#xff0c;因为小目…

监控易:信创工程,几十万台终端设备桌面集中监控运维方案​

监控易&#xff1a;信创工程&#xff0c;几十万台终端设备桌面集中监控运维方案 从2019年开始,我国因国际国内形势的迫切要求,在信息和网络安全方面启动 “安全可靠工程”,全面深入推进信创运维及相关产品国产化。时至今日&#xff0c;已取得令世人瞩目的成果。 过去&#xff…

learn_C_deep_14 (条件编译的基本使用与理解)

目录 条件编译 1.条件编译如何使用&#xff1f; 2.为何要有条件编译? 3. 条件编译都在哪些地方用? 条件编译 1.条件编译如何使用&#xff1f; C语言的条件编译是一种在程序编译时根据条件选择不同代码段进行编译的技术。条件编译可以用于实现代码跨平台&#xff0c;开启…

C++小知识点(auto关键字)

&#x1f339;作者:云小逸 &#x1f4dd;个人主页:云小逸的主页 &#x1f4dd;Github:云小逸的Github &#x1f91f;motto:要敢于一个人默默的面对自己&#xff0c;强大自己才是核心。不要等到什么都没有了&#xff0c;才下定决心去做。种一颗树&#xff0c;最好的时间是十年前…

猿创征文|Spring系列框架之面向切面编程AOP

⭐️前面的话⭐️ 本篇文章将介绍一种特别重要的思想&#xff0c;AOP&#xff08;Aspect Oriented Programming&#xff09;&#xff0c;即面向切面编程&#xff0c;可以说是OOP&#xff08;Object Oriented Programming&#xff0c;面向对象编程&#xff09;的补充和完善。 …

Springcloud1---->Zuul网关

目录 简介加入zuul后的架构快速入门添加Zuul依赖编写zuul启动类编写zuul配置文件编写路由规则 面向服务的路由添加Eureka客户端依赖开启Eureka客户端发现功能添加Eureka配置&#xff0c;获取服务信息修改映射配置&#xff0c;通过服务名称获取 简化的路由配置过滤器使用场景自定…

这个 堆排序详解过程 我能吹一辈子!!!

文章目录 堆排序的概念堆的分类堆排序的算法思想堆排序的实现 堆排序的概念 堆是一种叫做完全二叉树的数据结构&#xff0c;可分为大根堆、小根堆&#xff0c;而堆排序就是基于这种结构产生的一种排序的算法。 堆的分类 大根堆&#xff1a;每个节点的值都大于或者等于它的左…

SpringBoot 读取 yml 文件属性值常用法总结

开发过程中有一些常量配置一般会写在application.yml文件中&#xff0c;而Spring Boot读取yml文件的主要方式有以下几种: 一、使用Value注解 在bean的属性上使用Value注解,直接读取yml中的值,如: 但这里面写法也有一些情况&#xff1a;其实这种写法对于 String 字符串其实没有…

计算机网络考试周极限复习--1

第一章 时延 因特网协议栈和OSI参考模型 应用层&#xff1a;报文 HTTP&#xff08;提供了Web文档的请求和传送&#xff09;&#xff0c;SMP&#xff08;提供了电子邮件报文的传送&#xff09;&#xff0c; FTP&#xff08;它提供两个端系统之间的文件传送&#xff09; 运输…