【Makefile由浅入深完全学习记录3】伪目标的引入

只有不停的努力,才能看起来很轻松!!!加qq1126137994共同学习探讨更多技术!!!

1、思考:

makefile中的目标究竟是什么?

在默认的情况下:

  1. make认为目标对应一个文件
  2. make比较目标文件和依赖文件之间的新旧关系,决定是否执行相应命令
  3. make以文件处理作为第一优先级

但是当我们的目标不是一个文件,语法上要有什么变化呢?
例如下图:
这里写图片描述
当执行:make clean 时,我们是希望执行rm *.o hello.out的命令的。、

如果文件中没有命名为clean的,上述执行可以正常进行,但是如果当文件中存在文件名为clean时,我们执行make clean命令,make程序就会把clean当成是那个文件来处理,而不会按上述所说的执行!

解决办法:
引入伪目标

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

伪目标的语法:先声明,后使用!!!
本质:伪目标是make程序中特殊目标.PHONY的依赖

.PHONY:clean
##注释##
clean:rm *.o hello.out

下面给出一个例子来看看伪目标的使用(所依赖的文件func.c与main.c是上一篇文章里的点击链接查看:点击查看):


hello.out all : func.o main.ogcc -o hello.out func.o main.ofunc.o : func.cgcc -o func.o -c func.cmain.o : main.cgcc -o main.o -c main.c.PHONY : cleanclean:rm *.o hello.out

输入make的运行结果为:
这里写图片描述

输入make clean的运行结果为:
这里写图片描述

2、伪目标的妙用(函数调用)

伪目标的调用:规则调用(函数调用)

hello.out : func.o main.ogcc -o hello.out func.o main.ofunc.o : func.cgcc -o func.o -c func.cmain.o : main.cgcc -o main.o -c main.c.PHONY : rebuild clean all  ##原理:当一个目标的依赖包含伪目标时,伪目标所定义的命令总是被执行rebuild : clean all  ##模拟函数的调用all : hello.outclean :rm *.o hello.out

注意:如果我们使用的是GNU的make,用.PHONY声明伪目标没有任何问题,但是如果我们不是用的GNU的make,有可能其他的make程序不支持,PHONY声明伪目标,这个时候,我们就需要避开.PHONY,用其他方法声明伪目标!!!
可以像如下图一样定义伪目标clean:
这里写图片描述

原理:如果一个目标没有命令或者依赖,并且它不是一个已经存在的文件名,在执行此规则时,目标总会认为是最新的!!!
例子:


hello.out all : func.o main.ogcc -o hello.out func.o main.ofunc.o : func.cgcc -o func.o -c func.cmain.o : main.cgcc -o main.o -c main.cclean:Forcerm *.o hello.outForce:

运行结果与上述的运行结果一致!!!

3、总结:

  1. 默认情况下,make认为目标对应着一个文件
  2. .PHONY用于声明一个伪目标,伪目标不对应实际的文件
  3. 伪目标的本质是make中特殊目标.PHONY的依赖
  4. 使用伪目标可以模拟“函数调用”

想一起探讨以及获得各种学习资源加我(有我博客中写的代码的原稿):
qq:1126137994
微信:liu1126137994
可以共同交流关于嵌入式,操作系统,C++语言,C语言,数据结构等技术问题。

本学习记录完全来源于狄泰软件学院的相关课程,可以加我q:1126137994或者Q群:199546072 ,给你推荐更多学习课程。

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

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

相关文章

InnoDB的auto_increment指定值被重置问题

有时候新建的表需要对自增列指定初始值,但是有时候会出现明明指定过的初始值却被重置的现象。下面以一个小实验来说明这个问题:MySQL version:5.1.42 OS:redhat5.3无废话,建张表先:代码CREATETABLEsbtest1 ( id int(10) unsigned…

【Makefile由浅入深完全学习记录4】变量和不同的赋值方式

今天来学习Makefile中变量的不同的赋值方式!努力的意义就是让贫穷不再限制你的想象!加qq共同学习交流1126137994 1、概念 makefile中支持程序设计中变量的概念makefile中的变量只代表文本数据(字符串)makefile中的变量名规则 -…

前端学习(100):float注意点整理1

1只会影响后面得元素 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv"X-UA-Compatible…

USB转WIFI无线网卡驱动程序(RT5370驱动程序)的移植记录之一

学习交流加 个人qq&#xff1a; 1126137994个人微信&#xff1a; liu1126137994学习交流资源分享qq群&#xff1a; 962535112 今天记录我在I.MX6Q平台移植RT5370无线网卡驱动程序的过程&#xff0c;加qq1126137994 微信&#xff1a;liu1126137994 共同学习更多技术&#xff01;…

【Makefile由浅入深完全学习记录5】预定义变量的使用

今天学习Makefile预定义变量的使用&#xff0c;加qq&#xff1a;1126137994.微信&#xff1a;liu1126137994一起学习更多技术&#xff01;&#xff01;&#xff01; 1.预定义变量&#xff1a;自动变量 在Makefile中存在一些预定义过的变量&#xff0c;我们可以直接拿来使用而…

【Makefile由浅入深完全学习记录6】Makefile中变量的高级主题上

抓住基础&#xff0c;学习更多技术&#xff0c;迎接挑战&#xff0c;加qq&#xff1a;1126137994 微信&#xff1a;liu1126137994 一起学习更多技术~ 上一篇文章学习了makefile中的预定义变量的使用&#xff0c;今天来继续学习makefile中的变量&#xff01; 1、变量值的替换 …

USB转WIFI无线网卡驱动程序(内核自带RT5370驱动程序添加)的移植记录之二

学习交流加 个人qq&#xff1a; 1126137994个人微信&#xff1a; liu1126137994学习交流资源分享qq群&#xff1a; 962535112 今天记录我在I.MX6Q平台添加内核自带RT5370无线网卡驱动程序的过程&#xff0c;加qq1126137994 微信&#xff1a;liu1126137994 共同学习更多技术&…

Node.js安装详细步骤教程(Windows版)

Node.js安装详细步骤教程(Windows版) 什么是Node.js&#xff1f; 简单的说 Node.js 就是运行在服务端的 JavaScript。 Node.js是一个基于 Chrome V8 引擎的 JavaScript 运行环境&#xff1b; Node.js使用一个事件驱动、非阻塞式 I/O 的模型&#xff0c;使其轻量且高效&…

移植wpa_supplicant软件与DHCP软件解密WPA/WPA2 加密的无线网络

加qq1126137994与微信&#xff1a;liu1126137994 一起学习更多技术&#xff01; 现在的无线网络基本都是 WPA/WPA2 加密方式的&#xff0c;当我们在嵌入式Linux平台要实现无线网卡连接无线网时&#xff0c;我们需要一些工具来解密WPA/WPA2 加密方式的无线网。wpa_supplicant软…

xshell 连接不了 centos7

xshell 连接不了 centos7 采用的是net模式 有一段时间没有使用虚拟机了&#xff1a;今天打开后突然不能使用了&#xff0c;发现主机ping不通虚拟机了&#xff0c;而虚拟机可以正常联网&#xff0c;可以ping主机 查了一下 vmnet8 自动分配的 ipv4 和虚拟机 分配的网关地址没…

java多线程思维导图

分享是最好的整理&#xff0c;利用csdn 平台保存一下

【Makefile由浅入深完全学习记录7】Makefile中变量的高级主题下

加qq&#xff1a;1126137994 微信&#xff1a;liu1126137994 一起学习更多技术~ 继续上一篇文章关于变量的学习&#xff01; 1、环境变量&#xff08;全局变量&#xff09; -makefile中能够直接使用环境变量的值 如果makefile中定义了同名变量&#xff0c;则环境变量将被覆…

【Makefile由浅入深完全学习记录8】条件判断语句

加qq&#xff1a;1126137994 微信&#xff1a;liu1126137994 一起学习更多技术~ 今天来学习Makefile中条件判断语句&#xff01; Makefile也算是一门语言&#xff0c;它有自己的语法&#xff0c;那么它应该也会像C/C语言一样&#xff0c;支持条件判断语句&#xff01; Makef…

C语言实现位数组(bit数组)与位数组的简单应用举例

学习交流加&#xff08;可免费帮忙下载CSDN资源&#xff09;&#xff1a;个人微信&#xff1a; liu1126137994学习交流资源分享qq群1&#xff08;已满&#xff09;&#xff1a; 962535112学习交流资源分享qq群2&#xff1a; 780902027 今天有朋友遇到一个笔试题&#xff1a;一个…

【常见笔试面试算法题12】动态规划算法案例分析

学习交流加 个人qq&#xff1a; 1126137994个人微信&#xff1a; liu1126137994学习交流资源分享qq群&#xff1a; 962535112 文章目录1、暴力搜索方法2、记忆搜索方法3、动态规划方法4、各种动态规划方法案例总结&#xff1a;给定数组arr&#xff0c;arr中所有数都为正数&…

kafka 思维导图

最近在培训沟通力过程中&#xff0c;一句话说的特别好&#xff0c;有输入就要有输出&#xff0c;最近又学习了一遍kafka 给大家分享一下

【C++深度剖析教程28】C++对象模型分析

学习交流加 个人qq&#xff1a; 1126137994个人微信&#xff1a; liu1126137994学习交流资源分享qq群&#xff1a; 962535112 今天记录学习的内容是&#xff1a;C对象模型分析&#xff01;&#xff01;&#xff01; 本质分析&#xff1a; class是一种特殊的struct 在内存中cl…

【C++深度剖析教程29】C++对象模型分析下

加qq1126137994&#xff0c;微信&#xff1a;liu1126137994 一起学习更多技术&#xff01;&#xff01;&#xff01; 今天来继续学习C对象模型&#xff01; 在C编译器内部&#xff0c;类可以理解为结构体子类是由父类成员叠加子类新成员得到的 下面来写一个程序分析C的继承…

java 思维导图

最近有时间&#xff0c;又整理了一下java 思维导图&#xff0c;持续优化中 子模块拆分总结&#xff1a;java基础 java思维导图 总结

【常见笔试面试算法题12续集一】动态规划算法案例1台阶问题练习题

加qq1126137994 一起学习更多技术&#xff01;&#xff01;&#xff01; 以下问题&#xff0c;都可以用非动态规划的方法做&#xff0c;我为了整理动态规划的方法思路&#xff0c;就全部用动态规划的思路来解决问题&#xff0c;这样还可以简化问题的处理&#xff0c;是时间复杂…