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.

00.嵌入式笔记——初识make工具和Makefile文件的更多相关文章

  1. make工具与Makefile文件

    make工具与Makefile文件 阅读目录 1. make工具 2. Makefile文件 3. Makefile的简单示例 4. 伪目标 5. Makefile 自动化变量 6. 编译生成多个可执 ...

  2. Linux工具入门:make工具与Makefile文件

    1. make工具 利用make工具可以自动完成编译工作,这些工作包括: 如果修改了某几个源文件,则只重新编译这几个源文件 如果某个头文件被修改了,则重新编译所有包含该头文件的源文件 利用这种自动编译 ...

  3. 使用autoconf和automake生成Makefile文件(转)

    Makefile好难写 曾经也总结了一篇关于Makefile的文章<make和makefile的简单学习>.但是,总结完以后,发现写Makefile真的是一件非常痛苦的事情,的确非常痛苦. ...

  4. 面试题----makefile文件的作用

    make工具和makefile文件 make工具和makefile文件简介 make命令和makefile文件的结合提供了一个在项目管理领域十分强大的工具.它不仅常被用于控制源代码的编译和链接,而且还 ...

  5. 【嵌入式开发】 嵌入式开发工具简介 (裸板调试示例 | 交叉工具链 | Makefile | 链接器脚本 | eclipse JLink 调试环境)

    作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42239705  参考博客 : [嵌入式开发]嵌入式 开发环境 (远 ...

  6. 《Go并发编程实战》读书笔记-初识Go语言

    <Go并发编程实战>读书笔记-初识Go语言 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在讲解怎样用Go语言之前,我们先介绍Go语言的特性,基础概念和标准命令. 一. ...

  7. 使用autogen工具生成Makefile遇到问题解决思路

    使用autogen工具生成Makefile,最新的应用程序很多都使用autogen,本着知行合一的精神 最近有空也研究了一下该工具的使用,详细步骤请参考文档: http://blog.csdn.net ...

  8. 4种用于构建嵌入式linux系统的工具_转

    转自:4种用于构建嵌入式linux系统的工具 Linux 被部署到比 Linus Torvalds 在他的宿舍里开发时所预期的更广泛的设备.令人震惊的支持了各种芯片,使得Linux 可以应用于大大小小 ...

  9. linux下使用automake工具自动生成makefile文件

    linux环境下,当项目工程很大的时候,编译的过程很复杂,所以需要使用make工具,自动进行编译安装,但是手写makefile文件比较复杂,所幸在GNU的计划中,设计出了一种叫做Autoconf/Au ...

  10. C++学习笔记25:makefile文件2

    Makefile文件语法 行解析:命令按行解析 命令行的行首字符为Tab键,其他行的行首字符不得为Tab键,但可以使用多个空格缩进 换行:命令太长时,行尾使用"\"换行 注释:行首 ...

随机推荐

  1. Jenkins篇-权限管理

    我使用 权限管理插件是Role Strategy Plugin,他可以对构建的项目进行授权管理,让不同的用户管理不同的项目,将不同环境的权限进行区分 1)安装插件 系统管理>插件管理查找Role ...

  2. L4168爱普生打印机重新刷机解决printer mode问题

    同事的一台EPSON L4168打印机出现无法打印的故障,显示printer mode.使用官网的升级工具,在更新升级模式下(用电源+左+下+三角形四个手指按住开启)刷机,重启问题依旧(仍然显示pri ...

  3. 为什么Spring官方不推荐使用 @Autowired?

    前言 很多人刚接触 Spring 的时候,对 @Autowired 绝对是爱得深沉. 一个注解,轻松搞定依赖注入,连代码量都省了. 谁不爱呢? 但慢慢地,尤其是跑到稍微复杂点的项目里,@Autowir ...

  4. Redis为什么这么快之IO多路复用

    情景复现 面试官:Redis为什么这么快? 我:1. 基于内存 2. 高效数据结构 3. 单线程 4. IO多路复用 面试官:那你讲讲Redis的IO多路复用模型是什么. 我:哦,嗯,啊,呀...IO ...

  5. Skyvern – AI浏览器自动化测试工具

    Skyvern – AI浏览器自动化测试工具 ​​ ‍ Skyvern是什么 Skyvern是开源的浏览器自动化工具,结合大型语言模型(LLMs)和计算机视觉技术实现复杂的网页交互和数据提取.与传统的 ...

  6. 物联网cc2530按键长按短按分别控制亮灯亮灭(详细版)

    ​ 一.在编辑程序之前搭建其基本框架,如下所示 #include <iocc2530.h> void main(void) { halBoardInit(); while(1) { } } ...

  7. 高效文件处理:Python pathlib实战指南

    在使用Python处理文件路径时,强烈建议使用pathlib. pathlib以面向对象的方式处理文件路径,既避免了很多陷阱,也能使执行许多路径的相关操作变得更容易. 本篇总结了常用的使用pathli ...

  8. uni-app小程序(快手、抖音)getCurrentPages使用坑位记录

    前情 uni-app是我比较喜欢的跨平台框架,它能开发小程序/H5/APP(安卓/iOS),重要的是对前端开发友好,自带的IDE让开发体验也挺棒的,公司项目就是主推uni-app. 坑位 最近在做一个 ...

  9. 【Amadeus原创】docker安装apache

    1, docker下载apache [root@it-1c2d webnav]# docker search apache [root@it-1c2d webnav]# docker pull htt ...

  10. 适配器模式应用~获取IP地址时想起了适配器

    获取IP地址信息时,一般我们需要一个HttpServletRequest对象,然后从请求头里获取x-forwarded-for的值,而当我们使用dubbo+netty开发rest接口时,如果希望获取I ...