Makefile

本篇博客是作者在学习Linux方面知识过程中,对Makefile片面的了解,从而产生了对Makefile有一个全面的认识的想法,在知道《跟我一起写Makefile》此书后,作者学习阅读过程中整理出的笔记。

目录

  • Makefile
  • makefile介绍:
    • 规则:
    • 示例:
    • 使用变量:
    • 自动推导:
    • [.o]和[.h]的依赖文件收拢:
    • 清空目标文件的规则:
    • Makefile文件名:
    • 引用其他Makefile
    • 环境变量MAKEFILES
    • make 的工作方式

makefile介绍:

make 命令执行时,需要一个 Makefile 文件,以告诉 make 命令需要怎么样的去编译和
链接程序。 规则是:

1)如果这个工程没有编译过,那么我们的所有 C 文件都要编译并被链接。

2)某几个 C 文件被修改,只编译被修改的 C 文件,并链接目标程序。

3)头文件被改变了,需要编译引用了这几个头文件的 C 文件,并链接目标程序。

规则:

target … : prerequisites …

command

解释:

target 也就是一个目标文件,可以是 Object File,也可以是执行文件。还可以是一个标签(Label)。

prerequisites 是要生成那个 target 所需要的文件或是目标。

command是make需要执行的命令。

依赖关系:

target 这一个或多个的目标文件依赖于prerequisites 中的文件,其生成规则定义在 command 中。

示例:

edit : main.o command.o \

display.o

cc -o edit main.o command.o \

display.o

main.o : main.c defs.h

cc -c main.c

command.o : command.c defs.h command.h

cc -c command.c

display.o : display.c defs.h buffer.h

cc -c display.c

clean :

rm edit main.o command.o display.o \

反斜杠(\)是换行符的意思,便于 Makefile 的易读,

目标文件(target)包含:执行文件 edit 和中间目标文件(*.o),

依赖文件(prerequisites)就是冒号后面的那些 .c 文件和 .h 文件

Tab 键作为开头

make 并不管命令是怎么工作的,他只管执行所定义的命令,

Makefile 中只有行注释,和 UNIX 的 Shell 脚本一样,其注释是用“#”字符。

clean 不是一个文件,它只不过是一个动作名字,类似于标签(lable),

要执行其后的命令,就要在 make 命令后明显得指出这个lable 的名字

使用变量:

如果 makefile 很复杂,那么我们就有可能会忘掉一个需要加入的地方,而导致编译失败。

为了 makefile 的易维护,在 makefile 中我们可以使用变量。makefile 的变量也就是一个字符串,可以理解成 C 语言中的宏。

objects = main.o command.o \

display.o

edit : $(objects)

cc -o edit $(objects)

main.o : main.c defs.h

cc -c main.c

command.o : command.c defs.h command.h

cc -c command.c

display.o : display.c defs.h buffer.h

cc -c display.c

clean :

rm edit $(objects)

声明一个变量,叫 objects,在 makefile 中以“$(objects)”的方式来使用这个变量,如果有新的 .o 文件加入,我们只需简单地修改一下 objects 变量就可以了。

自动推导:

我们的 make 会自动识别,并自己推导命令。

只要 make 看到一个[.o]文件,它就会自动的把[.c]文件加在依赖关系中,如果 make找到一个 whatever.o,那么 whatever.c,就会是 whatever.o 的依赖文件。就不用写cc -c whatever.c。

[.o]和[.h]的依赖文件收拢:

格式:

右边对应每一个[.h]文件,左边是需要右边[.h]文件的对应的[.o]文件

示例:

$(objects) : defs.h

kbd.o command.o files.o : command.h

display.o insert.o search.o files.o : buffer.h

这种风格,让我们的 makefile 变得很简单,但文件依赖关系有些凌乱。

一是文件的依赖关系看不清楚,二是如果文件一多,要加入几个新的.o 文件。

清空目标文件的规则:

每个 Makefile 中都应写一个清空目标文件(.o 和执行文件)的规则,这不仅便于重

编译,也利于保持文件的清洁。

一般的风格是:

clean:

rm edit $(objects)

更为稳健的做法是:

.PHONY : clean

clean :

-rm edit $(objects)

.PHONY 意思表示 clean 是一个“伪目标”,。而在 rm 命令前面加了一个小减号的意思是,也许某些文件出现问题,但不管,继续做后面的事。

clean 的规则不要放在文件的开头,clean 放在文件的最后。

Makefile文件名:

默认的情况下,make 命令会在当前目录下按顺序找寻文件名为“GNUmakefile”、“makefile”、“Makefile”的文件,找到了解释这个文件。

在这三个文件名中,最好使用“Makefile”这个文件名,因为,这个文件名第一个字符为大写,这样有一种显目的感觉。最好不要用“GNUmakefile”,这个文件是 GNU 的 make 识别的。

也可以使用别的文件名来书写Makefile,

要指定特定的 Makefile,你可以使用 make 的“-f”和“–file”参数,

引用其他Makefile

在 Makefile 使用 include 关键字可以把别的 Makefile 包含进来,include 的语法是: include

filename 可以是当前操作系统 Shell 的文件模式(可以包含路径和通配符)

在 include前面可以有一些空字符,但是绝不能是[Tab]键开始

include foo.make *.mk $(bar)

等价于:

include foo.make a.mk b.mk c.mk e.mk f.mk

如果文件都没有指定绝对路径或是相对路径的话,make 会在当前目录下首先寻找,

如果当前目录下没有找到,那么,make 还会在下面的几个目录下找:

1、如果 make 执行时,有“-I”或“–include-dir”参数,那么 make 就会在这个参数 所指定的目录下去寻找。

2、目录/include(一般是:/usr/local/bin 或/usr/include)存在的话,make 也会去找。

环境变量MAKEFILES

如果你的当前环境中定义了环境变量 MAKEFILES,那么,make 会把这个变量中的值做一个类似于 include 的动作。慎用。

make 的工作方式

make工作的执行步骤如下:

1、读入所有的 Makefile。

2、读入被 include 的其它 Makefile。

3、初始化文件中的变量。

4、推导隐晦规则,并分析所有规则。

5、为所有的目标文件创建依赖关系链。

6、根据依赖关系,决定哪些目标要重新生成。

7、执行生成命令。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java爬虫与正则表达式——用正则来爬取数据

APIJava帮我们写好的各种功能的Java类。这些Java类统称为API。正则表达式就是API帮我们写好的类。正则表达式例子: 字符类:[abc]:只能是a,b或c[^abc]:除了a,b,c之外的任何字符[a-zA-Z]&#xff…

【后端】.NET Core API框架搭建(8) --配置使用RabbitMQ

目录 1.添加包 2. 连接配置 2.1.连接字符串 2.2.连接对象 3.创建连接服务 3.1.添加配置获取方法 3.2.服务实现类 3.3.服务接口 4.创建生产者服务 4.1.生产者实现类 4.2.生产者接口 5.创建消费者服务 5.1.消费者服务接口 5.2.消费者接口 6.注册 7.简单使用案例 7.1.实现…

Apache SeaTunnel配置使用案例

前置操作 Apache SeaTunnel详解与部署(最新版本2.3.11)-CSDN博客 mkdir /usr/local/soft/apache-seatunnel-2.3.11/job/ 一、MySQL to HDFS 官方配置参考: MySQL | Apache SeaTunnel Hdfs文件 | Apache SeaTunnel 1、配置确认 将mysq…

GitCode 使用高频问题及解决方案

GitCode 作为一款强大的版本控制系统,在软件开发流程中起着举足轻重的作用。然而,在使用过程中,开发者们常常会遇到各种各样的问题。本文将汇总 GitCode 使用中的高频问题,并提供详细的解决方案,帮助开发者们更顺畅地使…

在FreeBSD系统使用chroot进入Ubuntu仿真环境使用Localsend软件发送和接受文件

LocalSend是一款非常实用的在不同系统(Windows、MacOS、Linux、Android和IOS)传递文件的程序。我们这次的实践,就是要在FreeBSD下也能发送和接收文件。 安装LocalSend 跟在Ubuntu下安装非常类似,只是不需要下面的第一步&#xf…

交叉熵损失F.cross_entropy在分类模型中的应用

一、核心思想:通过概率分布惩罚错误交叉熵损失的本质是: 比较模型预测的概率分布 vs 真实标签的概率分布,惩罚两者之间的差异。例如:真实标签:图像 0 → 文本 0(独热编码 [1, 0, 0, ...])模型预…

测试学习之——Pytest Day3

引言Pytest 作为 Python 中最受欢迎的测试框架之一,以其简洁的语法、强大的功能和丰富的插件生态系统,极大地提升了自动化测试的效率和可维护性。在本文中,我们将深入探讨 Pytest 的两大核心特性:Fixture 和插件管理,帮…

控制Vue对话框显示隐藏

正确做法 — 使用 Vue 数据驱动控制显隐你不需要手动设置 display: block&#xff0c;因为 Element Plus 的 <el-dialog> 是基于 v-model 或 :visible.sync 控制的。&#x1f527; 修改模板部分&#xff1a;将原来的&#xff1a;<el-dialog title"报文详情"…

直播带货与开源AI智能名片链动2+1模式S2B2C商城小程序:重塑电商营销新格局

摘要&#xff1a;本文聚焦于直播带货对互联网供需关系的深刻影响&#xff0c;分析其如何改变传统电商营销模式&#xff0c;实现从“人找货”到“货找人”的转变。同时&#xff0c;引入开源AI智能名片链动21模式S2B2C商城小程序这一创新概念&#xff0c;探讨其在直播带货背景下的…

Jmeter 性能测试响应时间过长怎么办?

当 JMeter 性能测试中出现 响应时间过长 的问题时&#xff0c;需要从 测试脚本、服务器、网络、JMeter配置 等多方面排查和优化。以下是详细的解决步骤和思路&#xff1a; B站最新性能进阶&#xff0c;学会这些jmeter性能测试技能&#xff0c;更助于正确设计、执行和分析性能测…

COZE官方文档基础知识解读第三期 —— prompt(提示词)

COZE官方文档基础知识解读第三期 —— prompt&#xff08;提示词&#xff09; 对于初步接触PE&#xff08;prompt engineering&#xff09; 的小伙伴们&#xff0c;你们可以去火山方舟提供的prompt工具&#xff0c;用工具&#xff08;其余的prompt网站https://www.promptinggu…

代码随想录算法训练营第三十二天|动态规划理论基础、LeetCode 509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯

目录 LeetCode 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯 感想 文档讲解&#xff1a;代码随想录 动态规划&#xff0c;英文&#xff1a;Dynamic Programming&#xff0c;简称DP&#xff0c;如果某一问题有很多重叠子问题&#xff0c;使用动态规划是最有效的。 …

SpringMVC3

一、JSON 与参数传递1.1JSON 是什么- JSON 是字符串&#xff1a;比如 {"name":"zhangsan","password":"123456","age":15} 就是一个 JSON 字符串&#xff0c;它用来在前后端、服务间传递数据。- JSON 库&#xff1a;Fastj…

查看.bin二进制文件的方式(HxD十六进制编辑器的安装)

文章目录Windows 系统上安装 HxD 十六进制编辑器的步骤。**HxD 是一款免费、轻量级的工具&#xff0c;适合查看和编辑 .bin 等二进制文件。****PS:实际安装过程中会发现找不到Windows11的版本&#xff0c;安装windows10的即可&#xff0c;并且没有区别setup版和portable版**安装…

Linux系统性能优化与监控

系统性能优化与监控是保障 Linux 服务器稳定运行的核心技术&#xff0c;涉及 ​​CPU、内存、磁盘 I/O、网络、进程​​ 等多维度的指标分析、问题定位与优化策略。以下从​​监控工具与指标​​、​​常见问题诊断​​、​​优化方法​​三个层面详细讲解&#xff0c;并结合​…

如何在 React + TypeScript 中实现 JSON 格式化功能

如何在 React TypeScript 中实现 JSON 格式化功能 作为前端开发者&#xff0c;我们经常需要处理 JSON 数据。无论是 API 调试、配置文件编辑还是数据转换&#xff0c;能够格式化 JSON 是一项基本但非常有用的技能。本文将详细介绍如何在 React 和 TypeScript 环境中实现 JSON…

Mac连接服务器Docker容器全攻略

苹果电脑( macOS 系统 )连接服务器、配置容器,整体思路和 Linux 终端操作更贴近,以下结合 macOS 特点,详细分步说明,以 Docker 容器 + 常见 Linux 服务器( 如 CentOS、Ubuntu )为例: 一、连接服务器(SSH 方式, macOS 终端原生支持 ) 1. 准备信息 找运维或云平台…

【字节跳动】数据挖掘面试题0019:带货直播间推荐:现在有一个带货的直播间,怎么把它精准地推送给有需要的用户

文章大纲 带货直播间推荐系统:原理、算法与实践 一、推荐系统在带货直播中的重要性 二、数据收集与处理 1. 用户数据 2. 直播间数据 3. 用户行为数据 4. 数据处理与特征工程 三、推荐算法实现 1. 基于内容的推荐 2. 基于协同过滤的推荐 3. 基于知识图谱的推荐 4. 混合推荐算法…

Windows10笔记本电脑开启BIOS

文章目录什么是BIOS一、方案一&#xff1a;快捷键进入二、方案二&#xff08;推荐&#xff09;各品牌快捷键大全什么是BIOS BIOS 全拼为 BasicInputOutputSystem, 即基本输入/输出系统,是计算机中非常基础而且重要的程序。把这一段程序存放在一个不需要电源的记忆体(芯片)中,就…

NFS、iSCSI 和lnmp部署操作

目录 &#xff08;一&#xff09;基础配置 1.NFS服务安装 2.修改配置文件 3.重载配置文件 4.查看共享目录 5.客户端挂载 6.更换共享目录 7.基础实验 &#xff08;二&#xff09;布置lnmp平台 1.php 安装软件 检测 2.连接MySQL 测试 3.软件实施 软件安装配置 &…