makefile 结构规则,依赖,伪目标

news2025/1/13 19:52:20

文章目录

  • 前言
  • 一、Makefile 规则格式
  • 二、依赖示例:
      • 依赖的规则
  • 三、伪目标
      • 1. makefile 中的伪目标:
      • 2. 伪目标的语法
      • 3. 伪目标的规则调用
      • 4. 绕开 .PHONY关键字定义伪目标
  • 四、小技巧:
      • 1. 命令无回显。
      • 2. 可执行文件 和 all 同时作为 makefie 中的第一条规则的目标。
  • 总结

前言


一、Makefile 规则格式

  1. makefile 的意义
    用于定义源文件间的依赖关系。
    说明 如何编译各个源文件并生成可执行的文件。

  2. Makefile 中规则的格式一般为:在这里插入图片描述
    各个元素的含义:

  • target : 通常是需要生成的目标文件名。make 所需执行的命令名称。
    可以包含多个目标,使用空格对多个目标名进行分离。
  • prerequisities : 当前目标 所依赖 的 其他目标或文件。
    可以包含多个依赖, 使用空格对多个依赖进行分离。
  • command : 完成目标所需要执行的命令
    每一个命令必须以 [ Tab ] 字符开始,[ Tab ] 字符告诉 make 此行是一个命令行。

二、依赖示例:

对于 makefile 的依赖关系,通过上文 我们对依赖有了一定的了解。
下面 来一个makefile 的依赖示例。

all : test
	@echo "make all"
	
test :
	@echo "make test"

解析上面的代码:

  • all : 在Makefile中,all是一个伪目标,用于指定默认要执行的规则。通常情况下,如果没有指定目标,默认执行的就是Makefile中的第一个目标。因此,我们可以把all作为第一个目标,当我们执行make命令时,默认会执行Makefile中的all规则,从而完成整个编译过程。

  • test : 由于 test 作为 all 的依赖目标, 所以在执行 all 的命令前 要先执行 test 目标的命令。

最后的运行结果就是 在终端 先打印出字符串 " make test ", 再打印出 " make all "。

依赖的规则

1.当目标对应的文件不存在,执行对应命令。
2.当依赖在时间上比目标更新,执行对应的命令。
3.当依赖关系连续发生时,对比依赖链上的每一个目标。

三、伪目标

1. makefile 中的伪目标:

  • 通过 .PHONY 关键字声明一个伪目标。
  • 伪目标不对应任何实际的文件。
  • 不管伪目标的依赖是否更新,命令总是执行

为什么要使用伪目标呢?

主要是 避免与同名文件冲突。例如,如果有一个名为 clean 的目标,而系统中也存在一个名为 clean 的文件,执行 make clean 命令时,可能会误删除同名文件。使用伪目标可以避免这种问题,因为伪目标不对应真正的文件,执行伪目标的命令不会影响同名文件。

2. 伪目标的语法

先声明 , 后使用。用 # 表示注释。
本质 : 伪目标是 make 中的特殊目标 .PHONY 的依赖。

# 声明一个 clean 的伪目标
.PHONY : clean  

clean :
	rm *.o hello.out

例如: clean 目标命令。命令 rm *.o hell.out. 表明删除 所有的 .o 文件,和 hello.out 可执行文件。

.PHONY : clean

clean :
	rm *.o hello.out

3. 伪目标的规则调用

原理: 当一个目标的依赖包含伪目标时,伪目标所定义的命令总是会被执行。

hello.out : func.o main.o
	gcc -o hello.out func.o main.o
	
func.o : func.c
	gcc -o func.o -c func.c
	
main.o : main.c
	gcc -o main.o -c main.c
	
#声明了rebuild clean all三条伪目标
.PHONY : rebuild clean all 

rebuild : clean all

all : hello.out

clean :
	rm *.o hello.out

rebuild 伪目标 依赖于 clean 和 all, 所以要 执行 rebuild 目标时,要先去执行 clean 和 all命令。
相当于函数的调用。

4. 绕开 .PHONY关键字定义伪目标

原理:
如果 一个规则没有命令 或者依赖,并且它的目标不是一个存在的文件名,则 在执行此规则时,目标总是被认为是最新的,命令就会总是执行。相当于 伪目标.PHONY的使用。

clean : FORCE
	rm *.o hello.out
	
FORCE :	

FORCE 目标没有命令 ,依赖。那么在执行此规则时,总是被认为是最新的,命令就会总是执行。

四、小技巧:

1. 命令无回显。

在Makefile中执行命令时,默认情况下会将命令回显到控制台上。也就是说,如果Makefile规则中包含命令,执行make命令时会显示命令的输出信息。

makefile 中可以在命令前加上 @ 符,即可将命令的回显去掉

2. 可执行文件 和 all 同时作为 makefie 中的第一条规则的目标。

工程开发中可以将最终的 可执行文件all同时作为 makefie 中的第一条规则的目标。
例如下面的代码:

hello.out all : main.o func.o
	gcc -o hello.out main.o func.o
	
main.o : main.c
	gcc -c main.c -o main.o
	
func.o : func.c
	gcc -c func.c -o func.o

当我们多次执行 make 时,就会出现下面的现象:
在这里插入图片描述
如果我们想要再次执行 makefile 文件,观察执行结果,而不出现上面的现象的话, 可以 添加一个 all :

all 是一个虚假目标(Phony Target),它并不表示生成实际的文件,而是一个用于指定默认执行的目标。当我们在终端(Linux/Mac)或命令提示符(Windows)中输入 make 执行构建操作时,如果没有指定目标,就会执行该 Makefile 文件中默认的目标。
在这里插入图片描述


总结

下一篇介绍 变量和不同的赋值方式。

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

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

相关文章

MOS管常见的故障分析

MOS在控制器电路中的工作状态:开通过程(由截止到导通的过渡过程)、导通状态、关断过程(由导通到截止的过渡过程)、截止状态。MOS主要损耗也对应这几个状态,开关损耗(开通过程和关断过程&#xf…

学java注解,看这一篇文章就够了

一、注解的概念 Annotation(注解)是一种标记,使类或接口附加额外信息,帮助编译器和 JVM 完成一些特定功能。 Annotation(注解)也被称为元数据(Metadata)是JDK1.5及以后版本引入的,用于修饰包、类、接口、字段、方法参数、局部变量等。 常见…

Powered by 平行云 | 我们与大有艺术一起,在玩儿一种很新的戏剧

可以用VR看的,才是真元宇宙! 平行云赋能大有艺术,开启孟京辉导演的元宇宙「沉浸式」戏剧《浮士德》。"全球第一场可以用VR看的元宇宙戏剧"是什么的体验? 让我们一起一探究竟! 你慢慢地走进了一片无边无际的…

巧用千寻位置GNSS软件| 铁路放样必备技巧

铁路放样是在铁路测量施工前的一项重要工作,千寻位置GNSS软件可轻松实现铁路放样,本期就和大家分享具体操作步骤。 点击【测量】->【铁路放样】,在线路库中选择一条线路点击【确定】直接进入线路中 心线放样,如图 5.16-1所示。…

实现方法、构造器位置的自动装配

1.Autowired注解概述 Autowired注解的源码 package org.springframework.beans.factory.annotation;import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPoli…

Uint8Array文件下载

vue项目,自己调用了阿里云OSS的SDK,进行文件的上传以及下载,有个功能是列表中的附件需要支持点击下载,这里就用到阿里云oss的文件下载,使用了Nodejs的SDK const OSS require(ali-oss); const client new OSS({...op…

nodejs+vue网上学生社团管理系统

并运用Photoshop CS6技术美化网页,辅之以CSS技术。系统是基于面向对象编程的web应用程序。本系统主要实现的功能有系统用户管理、社团信息管理、社团类别管理、社团活动管理、社团论坛管理、系统管理、个人资料管理、学生入团管理、社团公告管理、社团活动管理、社团…

Ubuntu22.04安装opencv依赖包libjasper-dev出现unable to locate libjasper-dev的终极解决办法

执行 sudo apt install libjasper-dev 提示 执行 sudo apt install libjasper1 libjasper-dev 仍然提示 更换软件源: sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main" sudo apt-get update提示 该仓库没有数…

tiechui_lesson05_内核小文件拷贝

主要学习在内核中的文件操作,包括文件的打开,创建,读取,写入,查询文件属性等。 涉及的API和宏函数 ZwOpenFileZwCreateFileZwQueryInformationFileZwReadFileZwWriteFileZwCloseInitializeObjectAttributes 1.文件的…

学习日记,java学习

题目 生病了,可能是羊了,喉咙好干,好难受 每日一题 1010. 总持续时间可被 60 整除的歌曲 难度中等268收藏分享切换为英文接收动态反馈 在歌曲列表中,第 i 首歌曲的持续时间为 time[i] 秒。 返回其总持续时间(以秒为单位)可被 60 整除的…

vue+elementui在线教学互动学习考试系统nodejs师生互动交流网站kpm58

语言 node.js 框架:Express 前端:Vue.js 数据库:mysql 数据库工具:Navicat 开发软件:VScode 前端vueelementui, (1) vue引入elementui 1.使用npm安装element-ui npm i element-ui -S 2.在main.js中导入使用vue import element-u…

Android WorldWind的使用与加载数方瓦片

明确下定义,数方瓦片也叫五层十五级瓦片。现记录下如何在World Wind Android中加载数方瓦片的方法。 原理 加载数方瓦片最核心的方法是WorldWindAndroid加载图片的方法,更加详细的使用说明请访问worldwind官网。核心代码如下: Sector sect…

Daimayuan Online Judge #613. 好序列(思维题 暴力/启发式分裂)

题目 思路来源 知乎严格鸽 (暴力/启发式分裂)代码源每日一题 Div1 好序列 - 知乎 题解 启发式分裂,可以认为是启发式合并的逆过程 比较直白的想法是找到第一个只出现一次的数的位置x,然后分治[1,x-1]和[x1,n] 但是这样最坏复杂度是O(n^2)的&#xf…

数字化转型对企业的好处有哪些(上)

过时的技术、流程和客户关系管理困难是当前阻碍企业增长的主要障碍,CRM系统是企业数字化转型的主要工具,帮助企业简化操作、提高效率,为客户提供更加卓越的客户体验。下面说说,企业数字化转型的十大好处。 放眼全球来看&#xff…

第四十三章 Unity 开关 (Toggle) UI

本章节我们介绍开关 (Toggle)和开关组 (Toggle Group)。首先,我们点击菜单栏“GameObject”->“UI”->“Toggle”,然后调整它的位置,效果如下所示 相信大家在很多网页中也看到过类似的UI元素,它通常用于让用户勾选某些选项。…

计算机二级精选习题精讲精练

请点击↑关注、收藏,本博客免费为你获取精彩知识分享!有惊喜哟!! 1、在线性表的链式存储结构中,其存储空间一般是不连续的,并且( ) A)前件结点的存储序号大于后件结点的存储序号 B&#x…

java排序算法精讲

排序算法 概要一、冒泡排序概念实现步骤 代码 二、选择排序概念实现步骤 代码 三、插入排序概念实现步骤 代码 四、快速排序概念实现步骤 代码 五、归并排序概念实现步骤 代码 六、堆排序概念实现步骤 代码 总结以二维表表现出各个排序的关系 概要 Java是一种面向对象的编程语言…

一篇文章带您区分GNSS欺骗模拟测试的两种方式

写在前面 注意:提供的设备与案例、使用指南等指导性文件是为了在测试环境中对接收机的抗干扰能力进行验证,而非出于欺骗或干扰真实环境中的GNSS信号的目的!请确保通过线缆连接应用或暗室应用,若因为违规使用产生的任何法律后果和…

携带数据的Ajax POST请求

前端页面代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <title>发送ajax POST请求 看如何携带数据</title> <script type"text/javascript"> …

MES管理系统有什么功能?前期实施MES需要做些什么

MES系统是在制造业数字化的环境下&#xff0c;围绕生产制造执行而开发的一套生产管理系统。它以车间为管理核心&#xff0c;通过集成各信息系统&#xff0c;整合企业资源&#xff0c;实现从订单下达到产品完成的整个生产制造过程的数字化管理。 MES系统在实施前需要进行各种准备…