通熟易懂地讲解GCC和Makefile
1. 嵌入式开发工具链:GCC
GCC(GNU Compiler Collection)是一个强大且常用的编译器套件,支持多种编程语言,比如 C 和 C++。在嵌入式开发中,GCC 可以帮助我们把人类可读的 C/C++ 代码编译成机器可以理解的二进制指令(也就是可以在硬件上运行的程序)。这整个过程包括几个重要步骤:
- 预处理:GCC 会先处理代码中的预处理指令,比如
#include和#define。这些指令会在编译之前展开,把头文件插入进来,替换宏定义等。 - 编译:预处理完的代码会被转换成汇编代码。这个阶段主要是把高级语言转换成低级语言(接近机器语言)。
- 汇编:GCC 将汇编代码转换成机器码,生成目标文件(
.o文件)。这些目标文件是二进制格式的,但还不能单独运行。 - 链接:GCC 将所有的目标文件和所需的库文件组合在一起,生成一个可执行的二进制文件。这一步会把所有函数和变量连接起来,形成最终的可执行文件。
小结:GCC 工具链可以将C 代码转化为嵌入式设备可以运行的程序,涵盖了从预处理到链接的整个过程。
2. 构建流程:Makefile
当项目有多个源文件时,手动使用 GCC 命令来编译和链接每个文件会非常繁琐。这时,Makefile 可以帮我们自动化这个过程。Makefile 是一种构建脚本,使用 make 工具来解释和执行。它可以帮你更轻松地管理大型项目,并在代码发生变化时只编译必要的部分。
Makefile 基本概念
- 目标(Target):通常是你想要生成的文件,比如最终的可执行文件。
- 依赖(Dependencies):是生成目标所需的文件,比如源代码文件(
.c文件)或头文件(.h文件)。 - 命令(Commands):是为生成目标而需要执行的命令,比如调用 GCC 编译器。
一个简单的 Makefile 示例
假设我们有两个源文件 main.c 和 utils.c,编写一个 Makefile 来自动构建项目。
# 目标文件
output: main.o utils.ogcc -o output main.o utils.o # 链接所有目标文件,生成可执行文件 output# 生成 main.o
main.o: main.cgcc -c main.c # 把 main.c 编译成 main.o# 生成 utils.o
utils.o: utils.cgcc -c utils.c # 把 utils.c 编译成 utils.o# 清理生成的文件
clean:rm -f *.o output # 删除所有 .o 文件和可执行文件 output
Makefile 构建流程说明
- make 工具会从顶部开始解释 Makefile,寻找第一个目标
output。它需要main.o和utils.o作为依赖,所以会先检查这些目标。 - 如果
main.o或utils.o没有生成,make会运行对应的命令来编译它们。 - 一旦
main.o和utils.o都生成好了,make会执行gcc -o output main.o utils.o来生成最终的可执行文件output。 - 如果你修改了
main.c,make只会重新编译main.o,而不会重新编译utils.o,从而节省时间。
Makefile 的好处
- 自动化:不需要手动输入复杂的编译和链接命令,
make会自动帮你完成。 - 效率:只有在文件发生变化时才会重新编译,减少不必要的重复编译,节省时间。
- 可扩展性:你可以轻松地为大型项目添加更多源文件或编译选项。
小结
- GCC:是一个编译工具链,可以把 C/C++ 代码转换成嵌入式设备可以运行的程序。
- Makefile:是一个构建工具,可以自动化和优化项目的编译流程,特别是在项目规模较大时非常有用。
相关文章:
通熟易懂地讲解GCC和Makefile
1. 嵌入式开发工具链:GCC GCC(GNU Compiler Collection)是一个强大且常用的编译器套件,支持多种编程语言,比如 C 和 C。在嵌入式开发中,GCC 可以帮助我们把人类可读的 C/C 代码编译成机器可以理解的二进制…...
Java Agent使用
文章目录 基本使用premain使用场景 agentmain 关于tools.jar https://docs.oracle.com/en/java/javase/20/docs/specs/jvmti.html com.sun的API,如果使用其他厂商的JVM,可能没有这个API了,比如Eclipse的J9 https://www.ibm.com/docs/en/sdk…...
selenium 点击元素报错element not interactable
描述说明: 我这里是获取一个span标签后并点击,用的元素自带的element.click(),报错示例代码如下: driver.find_element(By.XPATH,//span[id"my_span"]).click() # 或者 elementdriver.find_element(By.XPATH,//span[i…...
【大数据技术基础 | 实验七】HBase实验:部署HBase
文章目录 一、实验目的二、实验要求三、实验原理四、实验环境五、实验内容和步骤(一)验证Hadoop和ZooKeeper已启动(二)修改HBase配置文件(三)启动并验证HBase 六、实验结果七、实验心得 一、实验目的 掌握…...
Android进程保活,lmkd杀进程相关
lmk原理 Android进程回收之LowMemoryKiller原理 lmkd 更新进程oomAdj; 设备端进程被杀可能原因...
SDL 播放PCM
SDL2播放PCM使用SDL2播放PCM音频采样数据。SDL实际上是对底层绘图API(Direct3D,OpenGL)的封装,使用起来明显简单于直接调用底层API。 测试的PCM数据采用采样率44.1k, 采用精度S16SYS, 通道数2 函数调用步骤如下: [初始化]SDL_In…...
基于MPPT最大功率跟踪的光伏发电蓄电池控制系统simulink建模与仿真
目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于MPPT最大功率跟踪的光伏发电蓄电池控制系统simulink建模与仿真。本系统包括PV模块,电池模块,电池控制器模块,MPPT模块,PWM模…...
深入解析Vue3:从入门到实战(详细版)
文章目录 前言一、Vue3简介官网地址主要特点 二、安装与创建Vue3项目使用Vue CLI创建项目使用Vite创建项目 三、Composition API详解Setup函数ref与Reactive生命周期钩子计算属性和监听器 四、新特性与优化响应式系统更好的TypeScript支持类型定义类型推断新组件全局API重构更好…...
Pr 视频效果:ASC CDL
视频效果/颜色校正/ASC CDL Color Correction/ASC CDL ASC CDL ASC CDL效果通过对红、绿、蓝三个原色通道的独立调整,实现对图像色彩的精确控制。在此基础上,还可用于调整处理后图像的整体饱和度。 ◆ ◆ ◆ 效果选项说明 斜率 Slope、偏移 Offset和功…...
C++ --- Socket套接字的使用
目录 一.什么是Socket套接字? 二.Socket的使用: 前置步骤: 为什么要加入 WSAStartup 和 WSACleanup ? 1.创建Socket: 2.绑定Socket: 3.服务端监听连接请求: 4.服务端接受客户端连接&…...
MG协议转换器:制氢行业的数字桥梁
在新能源产业蓬勃发展的今天,制氢行业正迎来前所未有的发展机遇。作为清洁能源的重要组成部分,氢气的生产与利用不仅关乎环境保护,更是推动能源结构转型的关键一环。然而,在制氢行业的数字化转型进程中,数据的传输与处…...
人工智能技术的未来:变革生活与工作的潜力
随着人工智能(AI)技术的不断发展,我们已经见证了其在各行各业的巨大变革。无论是在医疗、商业还是日常生活中,AI都正在悄然改变着我们的工作方式和生活方式。未来,人工智能的应用前景广阔,它将继续深入我们…...
D60【python 接口自动化学习】- python基础之数据库
day60 数据库定义 学习日期:20241106 学习目标:MySQL数据库-- 128:数据库定义 学习笔记: 无处不在的数据库 数据库如何存储数据 数据库管理系统(数据库软件) 数据库和SQL的关系 总结 数据库就是指数据…...
零基础大龄程序员如何转型AI大模型,系统学习路径与资源推荐!!
前言 随着科技的飞速发展,AI大模型浪潮席卷全球,相关岗位炙手可热。在这个背景下,许多大龄程序员开始思考如何转型,以适应时代的变化。结合自身编程基础,大龄程序员可以学习机器学习、深度学习算法,投身于…...
vue3+vant实现使用van-picker实现三级级联菜单展示(含递归遍历)
1、递归遍历三级展示,禁用自动弹起软键盘、设置文档自动换行避免过长文本省略号展示 <div class"text_div"><van-fieldclass"span_text":center"true"v-model"jobLevelCodeText"is-linklabel"任职岗位"…...
oracle-函数-grouping sets(x1,x2,x3...)的妙用
GROUPING SETS 允许你为多个列组合生成分组汇总。它类似于多个 GROUP BY 子句的 UNION ALL 操作,但更加简洁和高效 首先:创建表及接入测试数据 create table students (id number(15,0), area varchar2(10), stu_type varchar2(2), score number(20,2))…...
人工智能在医疗病例诊断中的应用与展望
人工智能在医疗病例诊断中的应用与展望 摘要: 本文探讨了人工智能在医疗病例诊断中的卓越应用、显著优势、面临的挑战及应对策略,以及未来展望。人工智能在医学影像诊断、病理诊断和辅助临床诊断方面展现出巨大潜力,为医学研究和临床治疗带来…...
OceanBase 安装使用详细说明
OceanBase 安装使用详细说明 一、系统环境要求二、安装OceanBase环境方案一:在线下载并安装all-in-one安装包方案二:离线安装all-in-one安装包安装前的准备工作三、配置OceanBase集群编辑配置文件部署和启动集群连接到集群集群状态和管理四、创建业务租户和数据库创建用户并赋…...
CI_CD
什么是CI/CD 在前端开发中,CI/CD 是 Continuous Integration(持续集成)和 Continuous Deployment/Continuous Delivery(持续部署/持续交付)的简称。它是一种软件开发实践,自动化了应用的构建、测试和发布过…...
Linux -- 初识线程
目录 线程的初步认识 为什么需要线程 怎么让代码分成多个执行流并发执行呢? 管理线程 线程的初步认识 线程是进程内部的一个执行分支,线程是CPU调度的基本单位。 在Linux操作系统中,线程是程序执行流的最小单位。一个进程可以包含多个线…...
(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...
376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案
目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后,迭代器会失效,因为顺序迭代器在内存中是连续存储的,元素删除后,后续元素会前移。 但一些场景中,我们又需要在执行删除操作…...
tomcat指定使用的jdk版本
说明 有时候需要对tomcat配置指定的jdk版本号,此时,我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...
SQL Server 触发器调用存储过程实现发送 HTTP 请求
文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...
