当前位置: 首页 > 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:是一个构建工具,可以自动化和优化项目的编译流程,特别是在项目规模较大时非常有用。
http://www.lryc.cn/news/478673.html

相关文章:

  • Java Agent使用
  • selenium 点击元素报错element not interactable
  • 【大数据技术基础 | 实验七】HBase实验:部署HBase
  • Android进程保活,lmkd杀进程相关
  • SDL 播放PCM
  • 基于MPPT最大功率跟踪的光伏发电蓄电池控制系统simulink建模与仿真
  • 深入解析Vue3:从入门到实战(详细版)
  • Pr 视频效果:ASC CDL
  • C++ --- Socket套接字的使用
  • MG协议转换器:制氢行业的数字桥梁
  • 人工智能技术的未来:变革生活与工作的潜力
  • D60【python 接口自动化学习】- python基础之数据库
  • 零基础大龄程序员如何转型AI大模型,系统学习路径与资源推荐!!
  • vue3+vant实现使用van-picker实现三级级联菜单展示(含递归遍历)
  • oracle-函数-grouping sets(x1,x2,x3...)的妙用
  • 人工智能在医疗病例诊断中的应用与展望
  • OceanBase 安装使用详细说明
  • CI_CD
  • Linux -- 初识线程
  • Uniapp底部导航栏设置(附带PS填充图标教程)
  • 单智能体carla强化学习实战工程介绍
  • 潮玩宇宙方块兽系统开发:可定制UI与多种游戏内嵌助力个性化体验
  • 什么是低代码?3000字低代码超全解读!
  • 雷池社区版7.1新版本自定义NGINX配置分析
  • [SAP ABAP] 面向对象程序设计-类和对象
  • 『大模型笔记』IBM技术团队:什么是智能体型RAG!
  • WPF 中 NavigationWindow 与 Page 的继承关系解析
  • WebRTC基础理论和通话原理
  • NPU 可不可以代替 GPU
  • Vue3版本的uniapp项目运行至鸿蒙系统