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

从零开始学习嵌入式----Makefile工具


 

一、Makefile 简明指南

 

        你是否曾经面对过一堆源代码文件,却不知道如何将它们编译成可执行文件?或者你是否厌倦了每次修改代码后都要手动输入冗长的编译命令?

 

        如果是的话,那么 Makefile 就是你的救星!

 

二、Makefile 是什么?

 

        Makefile 就像是一个项目的「菜谱」,它告诉计算机如何将你的源代码文件「烹饪」成可执行文件。它使用一种简单易懂的语法来定义文件之间的依赖关系以及编译规则。

 

三、Makefile 的基本结构

 

        一个简单的 Makefile 文件包含了一系列规则,每个规则通常由以下三个部分组成:

 

1)目标 (target): 你想要生成的文件,例如可执行文件或者目标文件。

2)依赖 (prerequisites): 生成目标文件所依赖的其他文件,例如源代码文件或者头文件。

3)命令 (commands): 生成目标文件需要执行的命令,例如编译命令或者链接命令。

 

以下是一个简单的例子:

 

myprogram: main.o utils.ogcc main.o utils.o -o myprogram#  #
main.o: main.c utils.hgcc -c main.c#  #
utils.o: utils.c utils.hgcc -c utils.c

 

在这个例子中,我们定义了三个规则:

 

1)第一个规则的目标是生成可执行文件 myprogram,它依赖于 main.o 和 utils.o 两个目标文件。生成 myprogram 的命令是使用 gcc 链接器将这两个目标文件链接起来。

2)第二个规则的目标是生成目标文件 main.o,它依赖于 main.c 和 utils.h 两个文件。生成 main.o 的命令是使用 gcc 编译器编译 main.c 文件。

3)第三个规则的目标是生成目标文件 utils.o,它依赖于 utils.c 和 utils.h 两个文件。生成 utils.o 的命令是使用 gcc 编译器编译 utils.c 文件。

 

四、如何使用 Makefile?

 

        要使用 Makefile, 只需要在终端中输入 make 命令即可。 make 命令会自动读取当前目录下的 Makefile 文件,并执行相应的规则来生成目标文件。

 

五、Makefile 的优势

 

使用 Makefile 可以带来以下优势:

 

1)自动化构建过程: 你只需要编写一次 Makefile 文件,就可以自动完成项目的编译、链接等操作,大大提高开发效率。

2)跟踪文件依赖关系: Makefile 可以自动跟踪文件之间的依赖关系,只有当依赖文件发生改变时才会重新编译相应的目标文件,避免了不必要的编译时间。

3)提高代码可维护性: Makefile 可以清晰地描述项目的构建过程,使代码更加易于维护和理解。

 

 

六、总结

 

        Makefile 是一个强大的工具,可以帮助你简化项目的构建过程,提高开发效率。希望这篇简明指南能够帮助你入门 Makefile,并开始享受它带来的便利。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 论文 | Chain-of-Thought Prompting Elicits Reasoningin Large Language Models 思维链
  • 大数据学习之Spark基础
  • 【Linux】Windows平台使用gdb调试FFmpeg源码
  • 【C++】类中的六个默认成员函数(构造函数、析构函数、拷贝构造函数、复制重载函数等)
  • MySQL 数据库基础概念
  • 任务需求准确度量;高效计算任务调度;算力资源统一度量
  • 新火种AI|微软和苹果放弃OpenAI董事会观察员席位
  • Centos新手问题——yum无法下载软件
  • 【两大3D转换SDK对比】HOOPS Exchange VS. CAD Exchanger
  • MongoDB - 集合和文档的增删改查操作
  • 【LeetCode】面试题 16.21. 交换和
  • CSS 【详解】样式选择器(含ID、类、标签、通配、属性、伪类、伪元素、Content属性、子代、后代、兄弟、相邻兄弟、交集、并集等选择器)
  • Clean My Mac X破解版,让您的电脑跟新的一样好用
  • 【栈和队列OJ题】
  • 33 IRF配置思路
  • Apache Spark Streaming 使用实例
  • JS变量作用域
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • socket.io+express实现聊天室的思考(三)
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • XML已死 ?
  • 回流、重绘及其优化
  • 坑!为什么View.startAnimation不起作用?
  • 区块链共识机制优缺点对比都是什么
  • 如何使用 JavaScript 解析 URL
  • 删除表内多余的重复数据
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • elasticsearch-head插件安装
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • # linux 中使用 visudo 命令,怎么保存退出?
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • (2)STM32单片机上位机
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (pycharm)安装python库函数Matplotlib步骤
  • (windows2012共享文件夹和防火墙设置
  • (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
  • (论文阅读26/100)Weakly-supervised learning with convolutional neural networks
  • (转)h264中avc和flv数据的解析
  • ... 是什么 ?... 有什么用处?
  • .NET Core引入性能分析引导优化
  • .net refrector
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .NET/C# 获取一个正在运行的进程的命令行参数
  • .net最好用的JSON类Newtonsoft.Json获取多级数据SelectToken
  • /dev/sda2 is mounted; will not make a filesystem here!
  • :“Failed to access IIS metabase”解决方法
  • [ vulhub漏洞复现篇 ] ECShop 2.x / 3.x SQL注入/远程执行代码漏洞 xianzhi-2017-02-82239600
  • [\u4e00-\u9fa5] //匹配中文字符
  • [383] 赎金信 js
  • [Android Studio 权威教程]断点调试和高级调试
  • [android] 切换界面的通用处理
  • [Angular 基础] - 表单:响应式表单