当前位置: 首页 > news >正文

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

嵌入式 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!

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

相关文章:

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

嵌入式 Linux 入门第十一课,Make 工具和 Makefile 的引入...... 矜辰所致目录 前言一、Linux 下多文件编译二、make 工具和 Makefile2.1 make 和 Makefile 是什么?2.2 通过 STM32 提前熟悉 Makefile2.3 GCC 与 make 的关系/区别? 三、一个简单的 Makefi…...

Serverless冷扩机器在压测中被击穿问题 | 京东云技术团队

一、现象回顾 在今天ForceBot全链路压测中,有位同事负责的服务做Serverless扩容(负载达到50%之后自动扩容并上线接入流量)中,发现新扩容的机器被击穿,监控如下(关注2:40-3:15时间段的数据)&…...

数仓中指标-标签,维度-度量,自然键-代理键等各名词深度解析

作为一个数据人,是不是经常被各种名词围绕,是不是对其中很多概念认知模糊。有些词虽然只有一字之差,但是它们意思完全不同,今天我们就来了解下数仓建设及数据分析时常见的一些概念含义及它们之间的关系。 本文首发于公众号【五分钟…...

Baumer工业相机堡盟工业相机使用BGAPI SDK将图像数据转换为Bitmap的几种方式(C++)(Mono)

Baumer工业相机堡盟工业相机使用BGAPI SDK将图像数据转换为Bitmap的几种方式(C) Baumer工业相机Baumer工业相机图像数据转为Bitmap的技术背景Baumer工业相机使用BGAPISDK将图像数据转换为Bitmap的几种方式1.引用合适的类文件2.BGAPI SDK原始图像数据为Bi…...

C++笔试笔记2

C笔试笔记2 百富计算机的笔试 const限定符:首先作用于左边,如果左边没东西,就作用于右边。 const int: 左边没有内容,所以const作用于右边,就是“整型常量”。等同于int const; int * const&am…...

手写Spring框架

手写Spring框架 各位道友,我发现现在贼卷底层代码,看完源码发下几天后,额!!!我当时看了啥! 还是自己写个迷你的spring框架,这样印象更加深刻,上干货,代码仓…...

微服务学习笔记--(Docker)

目录 初识DockerDcoker的基本操作Dockerfile自定义镜像Docker-ComposeDocker镜像服务 初始Docter 什么是DockerDocker和虚拟机的区别Docker架构安装Docker 初识Docker-什么是docker 项目部署的问题 大型项目组件较多,运行环境也较为复杂,部署时会碰…...

ChatGPT 国内版免费

ChatGPT 是最新的聊天机器人技术,它可以让你更快地完成各种任务。如果你想要一个在国内的免费版本,你来对地方了!在这篇文章中,我们将会分享与你 ChatGPT的最新信息,以及在国内使用 ChatGPT 的方法。如果你想要了解更多…...

推荐5个免费好用的UI模板网站!

1、即时设计 即时设计资源广场是一个聚集了大量优秀设计作品和大厂设计系统超过3000个UI组件库的设计师灵感库。该广场每月更新上百个精品模板,且还将这些模板分门别类按不同类型素材进行分类,其丰富的设计资源包括移动设计、网页设计、插画、线框图、矢…...

linux 安装 maven 3.8 版本

文章目录 1:maven 仓库官网 2、下载安装包 3、使用:Xftp 上传到你想放的目录 4、解压文件 ​编辑 5、配置环境变量 ​编辑 6、刷新 /etc/profile 文件 7、查看maven 版本 1:maven 仓库官网 Maven – Download Apache Mavenhttps://mave…...

Redis的三种持久化策略及选取建议

文章目录 Redis的三种持久化策略及选取建议前言RDB(快照)概述优缺点 AOF(追加文件)概述优缺点AOF刷盘策略AOF重写 选取正确的持久化策略AOF和RDB的选择AOF与RDB的混合模式AOF重写和RDB持久化的冲突AOF校验机制三种模式的选择建议 …...

力扣LCP 33. 蓄水

LCP 33. 蓄水 给定 N 个无限容量且初始均空的水缸,每个水缸配有一个水桶用来打水,第 i 个水缸配备的水桶容量记作 bucket[i]。有以下两种操作: 升级水桶:选择任意一个水桶,使其容量增加为 bucket[i]1 蓄水&#xff1…...

内网渗透(八十一)之搭建Exchange服务器

搭建Exchange服务器 环境安装准备 1、Windows Server 2012 R2以管理员身份运行Windows Powershell,安装必需的 Windows组件: Install-WindowsFeature NET-Framework-45-Features, Server-Media-Foundation, RPC-over-HTTP-proxy, RSAT-Clustering, RSAT-Clustering-CmdInt…...

web缓存Squid代理服务

缓存网页对象,减少重复请求 squid代理服务器,主要提供缓存加速,应用层过滤控制的功能 代理工作机制 1.代替客户机向网站请求数据,从而可以隐藏用户的真实ip地址 2.将获得的网页数据(静态web元素)保存到缓…...

vue实现聊天框自动滚动

需求 1、聊天数据实时更新渲染到页面 2、页面高度随聊天数据增加而增加 3、竖向滚动 4、当用户输入聊天内容或者接口返回聊天内容渲染在页面后,自动滚动到底部 5、提供点击事件操控滚动条上下翻动 环境依赖 vue:vue…...

项目中遇到的一些问题总结(六)

Minio Minio是一个开源的分布式对象存储系统,它使用纠删码技术来保护数据。纠删码技术是一种恢复丢失和损坏数据的数学算法,它将数据分块冗余的分散存储在各个节点的磁盘上,从而提供了一定程度的数据可靠性和冗余性。 在Minio中,…...

Linux线程5——生产消费模型

生产消费模型 1个交易场所:超市 2种角色:生产者/消费者 3种关系:生产者和生产者(竞争关系也叫互斥关系),消费者和消费者(竞争关系同样是互斥关系),生产者和消费者(互斥,同步关系:生产完再消费或消费完再生产)。 以上是生产消费模型遵守的“321”原则。 生产者和消…...

Vue + Springboot 文件上传项目笔记(一)

Vue Springboot 文件上传项目笔记(一) 前端 使用脚手架创建项目 vue create vue_fileuploaddemo等待命令执行完毕添加 element-ui 组件 E:\java\idea_java_maven\vue_fileuploaddemo>yarn add element-ui yarn add v1.22.19 [1/4] Resolving pac…...

【华为OD机试真题2023B卷 JAVA】座位调整

华为OD2023(B卷)机试题库全覆盖,刷题指南点这里 座位调整 知识点迭代 时间限制:1s 空间限制:256MB 限定语言:C(clang11), C++(clang++11), Java(javac 1.8), Python3(3.9), JavaScript Node(12.18.2), Go(1.14.4) 题目描述: 疫情期间课堂的座位进行了特殊的调整,不能出…...

Python 学习 2022.08.28 周日

文章目录 一、 概述1.1) 之前写的文章:1.2) 基础点1.3) 配置1.4) Python2 和 Python3 的区别1.5) 相关问题跟踪解决1.6) 其他 一、 概述 1.1) 之前写的文章: 【Python大系】Python快速教程《Python 数据库 GUI CGI编…...

微信小程序之bind和catch

这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的&#xff0c;根据Excel列的需求预估的工时直接打骨折&#xff0c;不要问我为什么&#xff0c;主要…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

leetcodeSQL解题:3564. 季节性销售分析

leetcodeSQL解题&#xff1a;3564. 季节性销售分析 题目&#xff1a; 表&#xff1a;sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容&#xff08;一&#xff09;CDN 基础概念1. 定义2. 组成部分 &#xff08;二&#xff09;CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 &#xff08;三&#xff09;CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...