Makefile零基础教学(一)初识makefile

news2024/9/26 5:21:04

从这篇文章开始就开始进入 Makefile零基础教程,相信只要看了本教程的都可以对 Makefile 有一个清晰的理解和正确的运用。那么现在就开始我们的 Makefile 学习之路。

文章目录

  • 一、什么是 Makefile,优点?
  • 二、什么是 make, 为什么使用make?
  • 三、make 和 Makefile 的关系
  • 四、简单的 Makefile 示例:
      • 1. 最简单的 Makefile 示例
      • 2. make 程序的使用示例
      • 3. make 程序的简写
  • 总结


一、什么是 Makefile,优点?

  1. Makefile 简介:
    Makefile 是一种用于自动化构建程序的脚本文件,通常包含了一系列规则和命令,用于指导构建系统如何生成目标文件。在构建程序时,Makefile 会根据文件之间的依赖关系,自动决定哪些文件需要重新构建,以及如何进行构建。

  2. Makefile 是一个描述文件。

  • 定义一系列规则来指定源文件编译的先后顺序。
  • 拥有特定的语法规则,支持函数定义 和 函数调用。
  • 能够直接集成操作系统中的各种命令。
  1. Makefile 的优点:
    包括其灵活性和高效性。一旦生成了Makefile,只需要简单地调用make命令,系统就能自动根据Makefile中的规则和命令,执行构建过程。这大大简化了构建过程,提高了构建效率。
    在这里插入图片描述

二、什么是 make, 为什么使用make?

  1. make 可以根据 Makefile 文件的规则和依赖关系,自动判断哪些文件需要重新构建,并调用相应的编译器、链接器等工具完成构建过程。make可以大大简化程序的构建工作,提高开发效率和代码质量。在使用make时,需要先编写 Makefile 文件,指定编译规则、依赖关系和命令等信息,然后执行make命令即可自动构建程序。

  2. make 是一个应用程序

  • 解析源程序之间的依赖关系
  • 根据依赖关系自动维护编译工作。
  • 执行宿主操作系统中的各种命令。
  1. 在工程中,我们面对的代码是成千上万的,如果使用 gcc- 编译器,我们会在后面写一大堆东西吗?
    答案是当然不会。make实现了增量编译的机制,只编译需要更新的文件,避免了不必要的重复编译,节省了时间和计算资源。同时,make支持多线程编译,可以提高编译速度,加快产品上线的速度。

三、make 和 Makefile 的关系

在这里插入图片描述

makemakefile 是紧密相关的两个概念。 make 可以根据 Makefile 文件的规则和依赖关系,自动判断哪些文件需要重新构建,并调用相应的编译器、链接器等工具完成构建过程。

Makefile 中的描述用于指导 make 程序如何完成工作; make 根据 Makefile 中的规则执行命令,最后完成编译输出

因此,可以说make依赖于Makefile,而Makefile则是make的输入文件。

通常,程序员会自己编写Makefile文件,以指导make执行正确的构建过程。Makefile文件可以由文本编辑器或专业的集成开发环境(IDE)创建和编辑,然后保存到项目的根目录或指定的目录中。

四、简单的 Makefile 示例:

首先,让大家观赏一下 最简单的 Makefile 示例是什么样子滴。

1. 最简单的 Makefile 示例


hello:
	echo "hello makefile"

可能有的童鞋看到这个会很蒙,不知道这是什么鬼东西。
那么现在给大家讲解一下,请看下图:
**加粗样式**
这个代码片段是一个最简单的Makefile文件,包含了一个规则和一条命令,其中:
(1) . 规则 :

hello:

这一部分定义了一个 名为"hello"的规则,用于指导make如何生成一个名为"hello"的目标文件 或执行一组相关的命令。这个规则没有依赖(关于依赖,我们下一篇文章会详细讲解,这里大家先看看),表示无论何时执行make都会执行这个规则。

(2) . 命令 :

echo "hello makefile"

这一部分是一个简单的Shell命令,用于输出一个字符串"hello makefile"。当make执行到"hello"这个规则时,它会运行这个命令,并输出相应的结果

注意: 目标后的命令需要用 Tab 键 ( ' \t ' ) 隔开!!!
echo是一个常见的命令行命令,它的作用是输出一段文本内容到终端(或标准输出)

综上所述,当运行make hello 命令时,make程序会读取这个Makefile文件,并执行其中的规则和命令。在这个例子中,它会输出"hello makefile"这个字符串到终端上。

2. make 程序的使用示例

make  -f  mf.txt  hello

功能说明:
以 hello 关键字作为目标查找 mf.txt 文件,并执行 hello 处的命令

  • -f 参数指定要使用的 Makefile 文件名。在本例中,使用的文件名为 mf.txt。
  • hello 是一个目标名称,表示执行的目标是名为 hello 的规则。在本例中,Makefile 文件 mf.txt 中应该包含定义名为 hello 的规则的指令。

这个命令行指令的作用是使用 Makefile 文件 mf.txt 中的规则和命令来生成或更新名为 hello 的目标文件。如果 Makefile 文件中没有定义名为 hello 的规则,则命令行指令将无法完成执行。

3. make 程序的简写

  1. 以 hello 关键字作为目标 查找 makefile 或 Makefile 文件,并执行 hello 处的命令。
make  hello

例如:下面的一个 makefile 文件,里面有 2 条命令,分别是 hello 和 text 。如果我们执行 make hello ,则会 执行哪条命令呢?
答案当然是 hello 后的命令了,因为 我们 的 make 后跟着的是 hello 目标。这里不是因为 hello 对象在最上面。
结果是 在终端打印处 hello makefile 字符串。
在这里插入图片描述

  1. 查找 makefile 或 Makefile 文件中的最顶层目标,并执行最顶层目标的命令。
make  

提问: 对于上面同一个 makefile 文件,我们这次执行 make ,那么会执行哪条命令呢?
答案: 执行 第一条 hello 目标后的命令。 因为 我们这里 只 查找 makefile文件中的最顶层目标(最顶层当然就是第一条 hello 了),并执行最顶层目标的命令。
结果是 在终端打印处 test 字符串。


总结

相信大家 已经对 Makefile 有了一个大致的了解了,那么下一节将为大家 详细介绍 Makefile 的结构。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/495141.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

可拓展哈希

可拓展哈希 借CMU 15445的ppt截图来说明问题。 我们传统静态hash的过程是hash函数后直接将值存入对应的bucket,但是在可扩展hash中,得查询Directory(左),存入directory指向的bucket(右)。 下面…

linux线程池、基于线程池的单例模式、读者写者问题

线程池&单例模式 一、什么是线程池二、设计思路三、代码实现四、基于线程池的单例模式4.1 懒汉模式设计思路 五、读者写者问题及读写锁 一、什么是线程池 线程池: 一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个…

flashback database 深入学习

一.FlashbackDatabase 和 Restore Points 说明 OracleFlashback Database and restore points are related data protectionfeatures that allow you to rewind data back in time tocorrect any problems caused by logical data corruption or user errors within adesignate…

gopher 初探

文章目录 gopher协议简介发送GET请求curlgopher gopher发POST请求 gopher协议 简介 Gopher是Internet上一个非常有名的信息查找系统,它将Internet上的文件组织成某种索引,很方便地将用户从Internet的一处带到另一处。在WWW出现之前,Gopher是…

【AI绘画】——Midjourney关键词格式解析(常用参数分享)

目前在AI绘画模型中,Midjourney的效果是公认的top级别,但同时也是相对较难使用的,对小白来说比较难上手,主要就在于Mj没有webui,不能选择参数,怎么找到这些隐藏参数并且触发它是用好Mj的第一步。 今天就来…

Motrix 全能型下载神器(时隔两年,重新焕发生机)

简介 Motrix 是一款功能强大的下载管理器,支持 HTTP、FTP、BT、磁力链等多种下载协议,同时还具备浏览器插件和跨平台(Windows、macOS、Linux)的特点。它拥有多线程下载、断点续传、任务调度、自动更新等多种实用特性,…

学习笔记:基于SpringBoot的牛客网社区项目实现(六)之发表帖子 + 评论 + 私信

一、过滤敏感词 二、发布帖子 业务流程: 1、先创建帖子的实体DiscussPost,属性有帖子id,user_id,title,content,type,status,create_time,comment_count,scor…

【Python入门知识】NumPy 数组搜索,案例+理论讲解

前言 嗨喽~大家好呀,这里是魔王呐 ❤ ~! 搜索数组 可以在数组中搜索(检索)某个值,然后返回获得匹配的索引。 要搜索数组,请使用 where() 方法。 实例 查找值为 4 的索引: import numpy as nparr np.…

[ tool ] Xpath选择器和selenium工具基本使用

XPath xpath介绍 是一门在XML文档中查找信息的语言 html文档准备 doc <html><head><base hrefhttp://example.com/ /><title>Example website</title></head><body><div idimages><a hrefimage1.html aabb>Name: My…

车载激光雷达原理+双激光雷达方案+纯激光雷达感知3Dbonding box

集度汽车透露了首款汽车机器人概念车车头部位的设计细节&#xff0c;车前灯和车前盖处激光雷达的设计清晰可见。至此&#xff0c;集度汽车的车前盖、前向双激光雷达自动驾驶技术方案首次曝光。 集度汽车官方也称&#xff0c;“双激光雷达”设计方案极具创新性&#xff0c;激光…

求中位数?

文章目录 如何求一个中位数&#xff1f;[295. 数据流的中位数](https://leetcode.cn/problems/find-median-from-data-stream/)常规思路&#xff1a;解决思路&#xff1a; 如何求一个中位数&#xff1f; 如果输入一个数组&#xff0c;让你求中位数&#xff0c;简单的解决方法就…

不合格机器人工程讲师如何坦然面对失败

能坦然面对的重要原因是我自己从一开始就知道注定要失败的&#xff0c;或者说失败率接近99.9%。 能够从失败中成长&#xff0c;不断挑战自我&#xff0c;收获更多更大的失败也是一种体验。 失败是客观事实&#xff0c;坦然是主观上的正能量的情绪。 用客观态度对待客观事实。 …

JavaScript class和继承的原理

&#xff08;对于不屈不挠的人来说&#xff0c;没有失败这回事。——俾斯麦&#xff09; class 相关链接 MDN链接 有关类的详细描述 关于构造函数&#xff0c;原型和原型链的说明 类的概述 类是用于创建对象的模板。他们用代码封装数据以处理该数据。JS 中的类建立在原型上…

4月跳槽进字节跳动了,面试真简单...

前言: 最近金三银四跳槽季&#xff0c;相信很多小伙伴都在面试找工作&#xff0c; 怎样才能拿到大厂的offer&#xff0c;没有掌握绝对的技术&#xff0c;那么就要不断的学习&#xff0c;没有绝对的天才&#xff0c;只有持续不断的付出。对于我们每一个平凡人来说&#xff0c;…

Detecting Kernel Memory Leaks in Specialized Modules with Ownership Reasoning

Detecting Kernel Memory Leaks in Specialized Modules with Ownership Reasoning 背景&#xff1a; 内存泄漏&#xff1a;A memory leak happens when an allocated memory region is not released even though it will never be used again.分配的内存未被正常释放。 内存…

Java高阶数据结构 图 图的表示与遍历

高阶数据结构&#xff01; 文章目录 Java高阶数据结构 & 图的概念 & 图的存储与遍历1. 图的基本概念1.1 图的属性1.2 无向图与有向图1.3 完全图1.4 简单路径和回路1.5 子图1.6 连通图 2. 图的存储&#xff08;理论&#xff09;2.1 ※邻接矩阵2.2 邻接链表3. 图的存储&a…

新唐NUC980使用记录(5.10.y内核):u-boot linux rootfs 编译与烧录测试(基于SD1位置SD卡)

文章目录 目的基础准备烧录环境开发编译环境SD卡分区 制作和设置编译工具链制作toolchain和rootfs拷贝rootfs内容到SD卡设置编译工具链 u-boot编译与测试下载、配置与编译烧录u-boot与环境变量 linux kernel编译与测试下载、配置与编译系统运行测试 总结设备树文件内容 目的 从…

【STM32】基础知识 第十一课 sys, delay usart 文件夹

【STM32】基础知识 第十一课 sys, delay & usart 文件夹 sys 文件介绍delay 文件夹函数简介SysTickSysTick 工作原理SysTick 寄存器介绍 delay_init() 函数delay_us() 函数usart 文件夹介绍printf 的使用常用输出控制符表常用转椅字符表 半主机模式简介 sys 文件介绍 函数…

浅谈Linux epoll机制

前言 概述 epoll是一种当文件描述符的内核缓冲区非空的时候&#xff0c;发出可读信号进行通知&#xff0c;当写缓冲区不满的时候&#xff0c;发出可写信号通知的机制&#xff1b; 关键函数 int epoll_create(int size);创建 eventpoll 对象&#xff0c;并将 eventpoll 对象…

Python+Yolov5墙体桥梁裂缝识别

程序示例精选 PythonYolov5墙体桥梁裂缝识别 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<PythonYolov5墙体桥梁裂缝识别>>编写代码&#xff0c;代码整洁&#xff0c;规则&am…