Makefile基础教程(伪目标)

news2024/11/25 6:37:15

文章目录

  • 前言
  • 一、伪目标概念
  • 二、进一步了解伪目标
  • 三、不使用.PHONY来定义伪目标
  • 总结


前言

本篇文章将讲解Makefile中的伪目标,Makefile的目标在前面的文章中我们已经讲解了那么这篇文章我们就来讲讲伪目标。

一、伪目标概念

Makefile 伪目标是一类特殊的目标,它们的目的是提供给 make 工具一些命令,而不是用来构建文件的。因为伪目标通常不会对应实际的文件,所以它们的目的也不是为了构建文件,而是执行一些特定的操作,如清理编译过的目标文件、运行测试等。

Makefile 伪目标的名字通常没有实际的文件名或者函数名那么有意义,通常以 .PHONY 为名,表示该目标是伪目标,不对应实际的文件。

例如,下面的 Makefile 文件定义了一个伪目标 clean,用于清理生成的目标文件:

hello all : hello.o func.o
	gcc -o hello hello.o func.o

hello.o : hello.c
	gcc -c -o hello.o hello.c

func.o : func.c
	gcc -c -o func.o func.c

.PHONY: clean

clean :
	rm *.o hello

首先我们执行make命令:
执行完make命令后能够查看到生成的.o文件和hello可执行文件:
在这里插入图片描述
然后我们执行make clean命令:
再次查看文件:
可以发现这些生成的.o和可执行文件都被移除了。
在这里插入图片描述
所以伪目标的作用就是可以帮助我们去执行一些特定的命令。

二、进一步了解伪目标

我们对上面这个makefile进行一些改进:

hello : hello.o func.o
	gcc -o hello hello.o func.o

hello.o : hello.c
	gcc -c -o hello.o hello.c

func.o : func.c
	gcc -c -o func.o func.c

.PHONY: clean rebuild all

rebuild : clean all

all : hello

clean :
	rm *.o hello

这里新添加了rebuild 和 all伪目标

那么我们就能够使用make rebuild 和make all这两个命令来执行makefile了

执行结果:

make rebuild就是帮助我们先清除生成的文件然后再重新生成这些文件。
在这里插入图片描述
为什么执行了make rebuild 就可以达到这样的效果呢?

当我们在命令行中输入 make rebuild 后,make 工具会先执行 clean 目标中定义的删除操作,然后再执行 all 目标中定义的编译操作,这相当于先清空所有目标文件,再完成新一轮的编译操作。

all 和 clean 作为伪目标,不对应实际的文件或者函数,所以它们不会触发实际的编译过程,而是只执行它所规定的命令。

三、不使用.PHONY来定义伪目标

前面我们都是使用的.PHONY来定义一个伪目标的,在这里也可以不使用.PHONY来定义伪目标。

在clean后面加一个FORCE依赖。
这个FORCE依赖在后面也作为一个目录使用,当一个目标没有命令或者依赖并且他也不是一个文件名时认为这个目标永远都是最新的。所以无论目录下是否存在clean文件执行make clean都可以达到我们想要的效果。

hello all : hello.o
	gcc -o hello hello.c

clean : FORCE
	rm *.o

FORCE : 

总结

本篇文章主要给大家讲解了什么是伪目标,希望大家好好总结。

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

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

相关文章

手机摄影(四)

第8章 人物拍摄 平拍显亲切 如果侧拍好看,可以选择 局部自拍表现神秘(比如嘴唇,眼睛,锁骨,要足够惊艳) 技巧: 简单背景适合人像和镜子回头(幅度不能太大)小清新&…

《NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis》论文精读

Abstract 我们提出了一种方法,通过使用稀疏的输入视图集优化底层连续体场景函数,实现了合成复杂场景新视图的最先进结果。我们的算法使用全连接(非卷积)深度网络表示场景,其输入是单个连续的5D坐标(空间位置(x, y, z)和观看方向(θ&#xff…

C++系列五:输入/输出

C输入输出 1. 输入2. 输出3. 格式化输出4. 总结 1. 输入 输入是指从外部源获得数据的过程, C中可通过键盘或文件等外部源来获取输入数据。 (1)cin cin是C标准库中的一个输入流对象,用于从标准输入设备(通常是键盘&a…

如何评价滤波器的去噪效果?

假如使用两种滤波器,那么滤波效果如何去评价1? 为了能够得到高质量的去噪后信号,需要对滤波器的滤波效果进行评价,选取去噪效果最好的滤波器对原始信号进行去噪处理。 一般使用信噪比和峰值信噪比对滤波器进行量化评价&#xff0c…

Docker 基础实战:环境搭建、容器、仓库、镜像

文章目录 Docker 基础实战环境搭建容器启动容器新建并启动容器终止容器启动已终止容器创建守护态容器 容器日志查看日志日志驱动 进入容器docker attachdocker exec 容器信息docker psdocker inspectdocker topdocker stats 删除容器容器快照导出快照导入快照 仓库Docker Hub本…

软考--快速掌握七层模型与各种协议的划分

目录 协议族 网络层涉及的协议 传输层涉及的协议 应用层涉及的协议 协议族 认识几个协议族,所谓协议族就是说他不是单一的协议。而是很多协议拼在一起的。 TCP/IP协议族是internet的标准协议族,所以使用广,但是tcp/ip协议族传输效率是比较…

面试题:String,StringBuilder和StringBuffer的区别

面试题:String,StringBuilder和StringBuffer的区别 一、String 1、String是一个长度不可变的字符序列,底层是一个被final修饰的char[]数组。 2、任何对String类型进行改变的操作实际上都是重新生产一个新的String对象,然后将指…

micro-app在vue-element-admin中一些使用研究

1、简述 本文承接上一篇micro-app在vue-element-admi中的搭建,对micro-app在vue-element-admin中的一些平时开发中常用的功能做了一些研究。本文代码 2、路由 关于路由,这边从两方面进行研究,一方面是对菜单的配置,另一方面是页…

❤ 个人博客的搭建和设置

❤ 个人博客的搭建和设置 闲暇时候自己试着做了一个自己的个人博客,博客使用的Github进行托管,还在阿里云买了属于自己的域名 具体步骤如下 1、登陆自己的博客账号,新建个人主页的仓库 2、到了我们的名字设置,格外注意&#xf…

Leetcode刷题之两两交换链表中的结点和相交链表

只有把抱怨环境的心情,化为上进的力量,才是成功的保证。 ——罗曼罗兰目录 🍉一.相交链表 💐1.双指针 🍍2.计算长度加双指针 🍒二.两两交换链表中的结点 🍌1.迭代 🍉一…

【Golang】多线程下载器的实现

〇、前言 多线程下载,顾名思义就是对一个文件进行切片访问,等待所有的文件下载完成后在本地进行拼接成一个整体文件的过程。 因此可以利用 golang 的多协程对每个分片同步下载,之后再合并且进行md5校验或者总长度校验。 一、请求资源 下载…

5.7学习周报

文章目录 前言文献阅读摘要简介数据方法论预测结果结论 时间序列预测总结 前言 本周阅读文献《Water quality forecasting based on data decomposition, fuzzy clustering and deep learning neural network》,文献主要结合数据分解、模糊C均值聚类和双向门控循环…

设计模式 - 工厂方法模式

设计模式 - 工厂方法模式 1、关于工厂方法模式2、工厂方法模式小试牛刀2.1、类图2.2、代码清单3、工厂方法模式的扩展3.1、简单工厂模式(静态工厂模式) 1、关于工厂方法模式 工厂方法模式,就是定义一个用于创建对象的接口,让子类决…

Ubuntu20升级nodejs版本

执行 grunt build的时候提示node版本过低 当前版本为10.19.0,不满足要求 安装 n,用于更新 node 版本的 sudo npm install n -g用n 下载 nodejs 的最新稳定版本 sudo n stable3. 安装完毕,node -r检查当前版本

【算法与数据结构】链表

链表 链表:结构定义 链表是由一串节点串联在一起的,链表的每个节点存储两个信息:数据下一个节点的地址 分清楚两个概念:什么是内存内部,什么是程序内部 内存内部: 信息存储在内存空间里的 程序内部&#…

复习笔记1

考纲(张友生版本软件架构 考试题型: 10*3单选 5*3简答题 5*3设计图(含画图) 10*2 论述题 10*2综合题 复习以课件为主,书为辅 第一章 (软件危机) ? ? 构造模型与实现 掌握软件结构体系核心模型 第二章 软件体…

阿里云Alibaba Cloud Linux镜像系统介绍及常见问题解答FAQ

阿里云服务器操作系统Alibaba Cloud Linux镜像怎么样?可以代替CentOS吗?Alibaba Cloud Linux兼容性如何?有人维护吗?漏洞可以修复吗?Alibaba Cloud Linux完全兼容CentOS,并由阿里云官方免费提供长期维护。 …

Java并发,夺命 60 问

基础 1.并行跟并发有什么区别? 从操作系统的角度来看,线程是CPU分配的最小单位。 并行就是同一时刻,两个线程都在执行。这就要求有两个CPU去分别执行两个线程。 并发就是同一时刻,只有一个执行,但是一个时间段内&am…

linux系统中rpm与Yum软件仓库

rpm的作用: 在没有rpm软件管理之前我们在安装、升级、卸载服务程序时要考虑到其他程序、库的依赖关系,所以在进行安装、校验、卸载、升级等操作时的难度就非常之大。 rpm机制则为就是为了解决这些问题而设计的,rpm有点像windows系统中的控制…

xawtv涉及的vivid系统调用分析

xawtv涉及的vivid系统调用分析 文章目录 xawtv涉及的vivid系统调用分析调用过程分析摄像头驱动程序必需的11个ioctl非必须必须 分析数据的获取过程1.请求分配缓冲区: ioctl(4, VIDIOC_REQBUFS // 请求系统分配缓冲区2.查询映射缓冲区:3.把缓冲区放入队列:4.启动摄像头5.用selec…