00.嵌入式笔记——初识make工具和Makefile文件

这篇具有很好参考价值的文章主要介绍了00.嵌入式笔记——初识make工具和Makefile文件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. make工具和Makefile文件

make是解决大工程编译的工具,描述哪些文件需要编译、哪些需要重新编译的文件就叫做 Makefile,Makefile 就跟脚本文件一样,Makefile 里面还可以执行系统命令。我们使用的时候只需要一个make命令即可完成整个工程的自动编译,极大的提高了软件开发的效率。

Makefile 的引入
如果工程中我们有 main.c、input.c 和 calcu.c 这三个 C 文件和 input.h、calcu.h 这两个头文件。使用gcc命令编译是gcc main.c calcu.c input.c -o main,命令的意思就是使用 gcc 编译器对 main.c、calcu.c 和 input.c 这三个文件进行编译,编译生成的可执行文件叫做 main。编译完成以后执行 使用./main 运行这个程序。
我们这个工程只有三个文件,如果几千个文件呢?其中有一个文件被修改了,使用上面的命令编译的时候所有的文件都会重新编译,编译一次所需要的时间就很长了。最好的办法是确定哪个文件被修改了,只编译这个被修改的文件即可。例如:

 gcc -c main.c
 gcc -c input.c
 gcc -c calcu.c
 gcc main.o input.o calcu.o -o main

前三行分别是将 main.c、input.c 和 calcu.c 编译成对应的.o 文件,使用了“-c”选项,是只编译不链接。最后一行命令是将编译出来的所有.o 文件链接成可执行文件 main。假如我们现在修改了calcu.c 这个文件,只需要将 caclue.c 这一个文件重新编译成.o 文件,然后将所有的.o 文件链接成可执行文件即,只需要下面两条命令即可:

gcc -c calcu.c
gcc main.o input.o calcu.o -o main

但是如果修改的文件很多,容易忘记编译不利于管理,为此我们需要引入Makefile工具:
1、如果工程没有编译过,那么工程中的所有.c 文件都要被编译并且链接成可执行程序。
2、如果工程中只有个别 C 文件被修改了,那么只编译这些被修改的 C 文件即可。
3、如果工程的头文件被修改了,那么我们需要编译所有引用这个头文件的 C 文件,并且链接成可执行文件。
在工程目录下创建名为“Makefile”的文件,文件名一定要叫做“Makefile”!!!且区分大小写!
Makefile 和 C 文件是处于同一个目录的,在 Makefile 文件中输入如下代码:

main: main.o input.o calcu.o
  gcc -o main main.o input.o calcu.o
main.o: main.c
  gcc -c main.c
input.o: input.c
  gcc -c input.c
calcu.o: calcu.c
  gcc -c calcu.c
 
clean:
  rm *.o
  rm main

代码中所有行首需要空出来的地方要使用“TAB”键!不要使用空格键!这是Makefile 的语法要求!
Makefile 编写好以后我们就可以使用 make 命令来编译我们的工程了,直接在命令行中输
入“make”即可,make 命令会在当前目录下查找是否存在“Makefile”这个文件,如果存在的
话就会按照 Makefile 里面定义的编译方式进行编译。

2.Makefile 语法

Makefile 里面是由一系列的规则组成的,这些规则格式如下:

目标…... : 依赖文件集合……
命令 1
命令 2

如上面的规则的目标是 main,main.o、input.o 和 calcu.o 是生成 main 的依赖文件,如果要更新
目标 main,就必须先更新它的所有依赖文件,如果依赖文件中的任何一个有更新,那么目标也
必须更新,“更新”就是执行一遍规则中的命令列表。make 命令会为 Makefile 中的每个以 TAB 开始的命令创建一个 Shell 进程去执行。
最后一个规则目标是 clean,它的功能就是完成工程的清理,它没有依赖文件,因此会默认为依赖文件都是最新的,所以其对应
的命令不会执行,当我们想要执行 clean 的话可以直接使用命令“make clean”,执行以后就会删
除当前目录下所有的.o 文件以及 main.文章来源地址https://www.toymoban.com/news/detail-479272.html

到了这里,关于00.嵌入式笔记——初识make工具和Makefile文件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 嵌入式学习笔记(16)反汇编工具objdump

    嵌入式学习笔记(16)反汇编工具objdump

    2.4.1反汇编的原理为什么要用反汇编 arm-linux-objdump -D led.elf led_elf.dis objdump是gcc工具链中的反汇编工具,作用是由编译链接好的elf格式的可执行程序反过来得到汇编源代码 -D表示反汇编 左边的是elf可执行程序(反汇编的源) 右边的是反汇编生成的反汇编程序 反汇编的原因有以

    2024年02月09日
    浏览(11)
  • 【ARM 嵌入式 编译 Makefile 系列 16 - Makefile 伪目标.PHONY 与 FORCE 详细介绍】

    请阅读 【ARM GCC Makefile 编译专栏导读】 .PHONY 是GNU make的一个特殊目标,它用来指定那些不产生文件的目标。如果一个目标被声明为 .PHONY ,那么make命令会忽略这个目标的文件名,即使在文件系统中存在同名的文件,make命令也会每次都执行这个目标的命令 在 Makefile 中, 目标

    2024年02月12日
    浏览(26)
  • 【嵌入式Linux】编译应用和ko内核模块Makefile使用记录

    【嵌入式Linux】编译应用和ko内核模块Makefile使用记录

    在Makefile中,变量的赋值可以使用以下几种方式: = :最基本的赋值符号,表示简单的延迟展开(lazy expansion)方式。变量的值将会在使用变量的时候进行展开。 := :立即展开(immediate expansion)的赋值方式。变量的值在赋值的时候立即展开,并且在后续的使用中不再改变。

    2024年02月08日
    浏览(16)
  • 【C语言】嵌入式C语言项目管理利器:深入理解Makefile的应用与实践

    【C语言】嵌入式C语言项目管理利器:深入理解Makefile的应用与实践

    目录 一、makedile的概述 1、案例引入 2、makefile  3、Makefile优点 二、makefile的语法规则  1、语法规则 2、简单实战 三、makefile的变量 1、自定义变量 2、系统环境变量 3、预定义变量 4、高级makefile gcc a.c b.c c.c ‐o main 如果只修改了b.c 使用gcc编译 需要对所有文件重新编译。makefi

    2024年02月15日
    浏览(11)
  • 基于ubuntu的STM32嵌入式软件开发(四)——应用软件工程的修改、Makefile及编译脚本的编写

    基于ubuntu的STM32嵌入式软件开发(四)——应用软件工程的修改、Makefile及编译脚本的编写

            本文主要介绍基于标准库函数移植的STM32的应用软件工程的修改,主要涉及到文件内容修改、Makefile文件编写、编译脚本编写等内容,其中编译脚本是基于arm-none-eabi-gcc的交叉编译器撰写的。程序亲测可以正常编译,生成.bin和.hex的可烧录镜像文件。 1.首先修改 pr

    2023年04月15日
    浏览(9)
  • 【嵌入式Qt开发入门】初识Qt——Linux下安装Qt

    【嵌入式Qt开发入门】初识Qt——Linux下安装Qt

            Qt 是一个跨平台的 C++开发库。主要用来开发图形用户界面(Graphical User Interface,简 称 GUI)程序。         Qt 虽然经常被当做一个 GUI 库,用来开发图形界面应用程序,但这并不是 Qt 的全部; Qt 除了可以绘制漂亮的界面(包括控件、布局、交互),还包含很多

    2024年02月16日
    浏览(47)
  • 【嵌入式学习笔记】嵌入式入门2——中断(外部中断)

    【嵌入式学习笔记】嵌入式入门2——中断(外部中断)

    打断CPU执行正常的程序,转而处理紧急程序,然后返回原暂停的程序继续运行,就叫中断 作用1: 实时控制在确定时间内对相应事件作出响应 ——定时器中断 作用2: 故障处理检测到故障,需要第一时间处理 ——外部中断 作用3: 数据传输不确定数据何时会来 ——串口中断

    2024年02月08日
    浏览(35)
  • 【嵌入式学习笔记】嵌入式基础9——STM32启动过程

    【嵌入式学习笔记】嵌入式基础9——STM32启动过程

    程序段交叉引用关系(Section Cross References):描述各文件之间函数调用关系 删除映像未使用的程序段(Removing Unused input sections from the image):描述工程中未用到被删除的冗余程序段(函数/数据) 映像符号表(Image Symbol Table):描述各符号(程序段/数据)在存储器中的地址、类

    2024年02月15日
    浏览(36)
  • 软考-嵌入式系统设计师:[嵌入式系统基础:笔记(一)]

    软考-嵌入式系统设计师:[嵌入式系统基础:笔记(一)]

    大家不要只收藏不关注呀,哪怕只是点个赞也可以呀!🤣 粉丝私信发邮箱,免费发你PDF!!! 因为准备备考中级嵌入式设计师证书,所以买了一些资料回来准备复习,本书为倪奕文老师编制的书,如果大家有时间和精力还是很建议大家去买一本的,这本书反而是能够让小白很快

    2023年04月08日
    浏览(209)
  • 嵌入式软件常用工具概览

    “工欲善其事,必先利其器”,选择高质量并适合自己工具可以提高效率,这里介绍一下一些嵌入式软件开发过程中常用工具。 VSCode :Visual Studio Code 出自微软的代码编辑器,需要的功能可以通过安装插件获得,插件非常丰富。相对于VS更轻量灵活、适合嵌入式开发场景。

    2024年02月11日
    浏览(11)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包