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

通熟易懂地讲解GCC和Makefile


1. 嵌入式开发工具链:GCC

GCC(GNU Compiler Collection)是一个强大且常用的编译器套件,支持多种编程语言,比如 C 和 C++。在嵌入式开发中,GCC 可以帮助我们把人类可读的 C/C++ 代码编译成机器可以理解的二进制指令(也就是可以在硬件上运行的程序)。这整个过程包括几个重要步骤:

  1. 预处理:GCC 会先处理代码中的预处理指令,比如 #include#define。这些指令会在编译之前展开,把头文件插入进来,替换宏定义等。
  2. 编译:预处理完的代码会被转换成汇编代码。这个阶段主要是把高级语言转换成低级语言(接近机器语言)。
  3. 汇编:GCC 将汇编代码转换成机器码,生成目标文件(.o 文件)。这些目标文件是二进制格式的,但还不能单独运行。
  4. 链接:GCC 将所有的目标文件和所需的库文件组合在一起,生成一个可执行的二进制文件。这一步会把所有函数和变量连接起来,形成最终的可执行文件。

小结:GCC 工具链可以将C 代码转化为嵌入式设备可以运行的程序,涵盖了从预处理到链接的整个过程。


2. 构建流程:Makefile

当项目有多个源文件时,手动使用 GCC 命令来编译和链接每个文件会非常繁琐。这时,Makefile 可以帮我们自动化这个过程。Makefile 是一种构建脚本,使用 make 工具来解释和执行。它可以帮你更轻松地管理大型项目,并在代码发生变化时只编译必要的部分。

Makefile 基本概念

  • 目标(Target):通常是你想要生成的文件,比如最终的可执行文件。
  • 依赖(Dependencies):是生成目标所需的文件,比如源代码文件(.c 文件)或头文件(.h 文件)。
  • 命令(Commands):是为生成目标而需要执行的命令,比如调用 GCC 编译器。

一个简单的 Makefile 示例
假设我们有两个源文件 main.cutils.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 构建流程说明

  1. make 工具会从顶部开始解释 Makefile,寻找第一个目标 output。它需要 main.outils.o 作为依赖,所以会先检查这些目标。
  2. 如果 main.outils.o 没有生成,make 会运行对应的命令来编译它们。
  3. 一旦 main.outils.o 都生成好了,make 会执行 gcc -o output main.o utils.o 来生成最终的可执行文件 output
  4. 如果你修改了 main.cmake 只会重新编译 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、递归遍历三级展示&#xff0c;禁用自动弹起软键盘、设置文档自动换行避免过长文本省略号展示 <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 操作&#xff0c;但更加简洁和高效 首先&#xff1a;创建表及接入测试数据 create table students (id number(15,0), area varchar2(10), stu_type varchar2(2), score number(20,2))…...

人工智能在医疗病例诊断中的应用与展望

人工智能在医疗病例诊断中的应用与展望 摘要&#xff1a; 本文探讨了人工智能在医疗病例诊断中的卓越应用、显著优势、面临的挑战及应对策略&#xff0c;以及未来展望。人工智能在医学影像诊断、病理诊断和辅助临床诊断方面展现出巨大潜力&#xff0c;为医学研究和临床治疗带来…...

OceanBase 安装使用详细说明

OceanBase 安装使用详细说明 一、系统环境要求二、安装OceanBase环境方案一:在线下载并安装all-in-one安装包方案二:离线安装all-in-one安装包安装前的准备工作三、配置OceanBase集群编辑配置文件部署和启动集群连接到集群集群状态和管理四、创建业务租户和数据库创建用户并赋…...

CI_CD

什么是CI/CD 在前端开发中&#xff0c;CI/CD 是 Continuous Integration&#xff08;持续集成&#xff09;和 Continuous Deployment/Continuous Delivery&#xff08;持续部署/持续交付&#xff09;的简称。它是一种软件开发实践&#xff0c;自动化了应用的构建、测试和发布过…...

Linux -- 初识线程

目录 线程的初步认识 为什么需要线程 怎么让代码分成多个执行流并发执行呢&#xff1f; 管理线程 线程的初步认识 线程是进程内部的一个执行分支&#xff0c;线程是CPU调度的基本单位。 在Linux操作系统中&#xff0c;线程是程序执行流的最小单位。一个进程可以包含多个线…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法&#xff0c;用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理&#xff0c;能够自动确定一个阈值&#xff0c;将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生&#xff0c;我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要&#xff0c;而您认真负责的教学态度&#xff0c;让课程的每一部分都充满了实用价值。 尤其让我…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中&#xff0c;我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道&#xff0c;它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...

C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...