当前位置: 首页 > 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;线程是程序执行流的最小单位。一个进程可以包含多个线…...

Python开发者快速上手,十分钟完成Taotoken API第一个聊天调用

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 Python开发者快速上手&#xff0c;十分钟完成Taotoken API第一个聊天调用 对于希望快速体验不同大语言模型能力的Python开发者来说…...

破冰总结:写给 QA 的一份 30 天 AI 技术转型学习路线图

写在前面:一个不得不面对的现实 打开招聘网站,搜索“高级QA工程师”,你会发现薪资最高的一批岗位都有同一个关键词:AI。不是指“用AI写测试用例”那种浮于表面的用法,而是要求你真正理解AI系统的工作原理、能评估模型输出质量、能设计对抗性测试方案、能把RAG管线部署到生…...

3个关键步骤:在macOS上制作Windows启动盘的完整指南

3个关键步骤&#xff1a;在macOS上制作Windows启动盘的完整指南 【免费下载链接】windiskwriter &#x1f5a5; Windows Bootable USB creator for macOS. &#x1f6e0; Patches Windows 11 to bypass TPM and Secure Boot requirements. &#x1f47e; UEFI & Legacy Sup…...

智慧铁路列车车辆和人员检测数据集VOC+YOLO格式5059张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件)图片数量(jpg文件个数)&#xff1a;5059标注数量(xml文件个数)&#xff1a;5059标注数量(txt文件个数)&#xff1a;5059标注类别…...

基于 RPA 自动化技术的私域机器人助手构建指南

利用自动化工作流实现私域运营中的消息智能响应与多任务协同 能力介绍 在私域流量运营中&#xff0c;如何高效响应用户需求、精细化管理社群是提升转化率的关键。传统的人工客服模式往往面临响应不及时、重复性劳动繁重等问题。 本方案基于 RPA&#xff08;机器人流程自动化…...

OpCore-Simplify技术解构:自动化OpenCore EFI配置引擎的架构剖析

OpCore-Simplify技术解构&#xff1a;自动化OpenCore EFI配置引擎的架构剖析 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 在开源系统定制领域&…...

终极指南:如何快速免费实现全网页截图完整捕获

终极指南&#xff1a;如何快速免费实现全网页截图完整捕获 【免费下载链接】full-page-screen-capture-chrome-extension One-click full page screen captures in Google Chrome 项目地址: https://gitcode.com/gh_mirrors/fu/full-page-screen-capture-chrome-extension …...

Proteus仿真进阶:用STM32F103驱动L298,深入理解PWM占空比与电机速度的映射关系

Proteus仿真进阶&#xff1a;用STM32F103驱动L298&#xff0c;深入理解PWM占空比与电机速度的映射关系 在嵌入式开发中&#xff0c;电机控制是一个经典且实用的课题。很多教程会告诉你如何通过STM32的PWM输出让电机转起来&#xff0c;但很少有人解释为什么代码中会出现"10…...

Modon与Montage Hotels Resorts合作在埃及拉斯伊尔赫克马引入超豪华酒店品牌

Montage Ras El Hekma&#xff08;拉斯伊尔赫克马蒙太奇酒店&#xff09;将在该地中海景区推出首批对外开放销售的品牌住宅&#xff0c;也是该地区的首个Montage&#xff08;蒙太奇&#xff09;度假村 总部位于阿布扎比的Modon Holding与Montage Hotels & Resorts&#xf…...

别再为printf发愁了!华大HC32L13x单片机串口打印的三种实战配置(Keil MDK环境)

华大HC32L13x单片机串口打印的三种高效配置方案 在嵌入式开发中&#xff0c;printf函数作为调试利器&#xff0c;其重要性不言而喻。然而&#xff0c;当您拿到华大HC32L13系列单片机官方SDK&#xff0c;按照常规ARM单片机经验配置printf时&#xff0c;却发现串口毫无反应——这…...