当前位置: 首页 > news >正文

makefile相关知识的讲解

目录

  makefile文件的介绍

  step1:手动创建一个makefile文件

step2:在文件当中编辑指定的命令

step3:退出makefile文件并使用make执行文件当中的命令

step4:使用clean指令清除生成的文件

  makefile当中的命令编写方式

  目标文件和依赖文件

   .PHONY的作用

   重复执行没有.PHONY修饰的指令:

   重复执行有.PHONY修饰的指令:

  调用make指令执行相应的命令:

  在代码的编写过程当中,我们经常会遇到需要多文件编辑的情况,但是只使用vim工具似乎只可以针对一个文件进行编辑操作。那么要想针对于多个文本文件进行同时编译,并将他们合为一体,发挥我们平时编写代码所具有的多文件的作用就需要引入一个新的概念:使用make指令将我们想要编译的所有文件都放到makefile文件当中即可。

  makefile文件的介绍

  makefile是一个文件,其中保存的是我们想要统一所进行的命令操作,例如我们编译代码生成可执行程序的时候所需要执行的 -E -S -c 等操作。(当然可以直接生成可执行程序,但是我们在这里为了模拟makefile的多指令执行操作而特意的分步进行)

  因为makefile起到管理命令的作用,所以我们再使用make执行之前必须先创建一个makefile文件,在这个文件当中编辑指定的命令。我们先来通过例子观察一下makefile的具体的使用方法,之后在进一步进行讲解。

  step1:手动创建一个makefile文件

step2:在文件当中编辑指定的命令

step3:退出makefile文件并使用make执行文件当中的命令

step4:使用clean指令清除生成的文件

  由于我们的指令都是编写在makefile文件当中的,所以我们的步骤一需要首先创建一个makefile文件就不需要进行过多的解释了。

  makefile当中的命令编写方式

   在使用makefile进行多个指令编辑多文件的时候会有一些新奇的东西,比如类似于第一行当中的蓝色字体表示的含义和第九行当中.PHONY表示的含义。

  目标文件和依赖文件

  我们先来介绍蓝色字体所在行表示的含义:

  其中很容易发现的是我们左边蓝色内容是我们紧接着一行命令的生成文件,而后面白色内容是我们生成生成文件所需要的文件。事实也正如我们看到的那样:左边的蓝色内容表示的是我们的目标生成文件,后面的白色的文件表示的是我们的依赖文件。我们通过后面的指令编译依赖文件生成目标文件。

  但是我们会发现另一个事实:我们之前并没有test.o文件呀。确实,当依赖文件不存在的情况下我们会自动向后进行查找,因为后面的命令可能回生成目标文件。当查找完所有的指令还不存在以来文件的时候就会产生报错。

  产生的报错:

   .PHONY的作用

  在明白了目标文件和依赖文件之后还有一个难点——那就是.PHONY究竟是什么呢?我们通过一个简单的现象进行观察:

   重复执行没有.PHONY修饰的指令:

   重复执行有.PHONY修饰的指令:

  我们会发现一个很明显的现象:在执行有.PHONY修饰的指令的时候如果已经存在了目标文件且目标文件没有被修改的时候我们并不会反复创建新的文件,而使用了.PHONY修饰的指令在make的时候并不会因为该指令刚刚被执行过就被忽略。就像是上图中的例子那样:clean指令执行了两次所以第二次删除文件的时候会因为文件不存在而产生异常提示。

  其实这就是.PHONY的作用——不让计算机干预我们代码的编译,只要执行一次指令就进行一次相应的操作。举一个简单的例子:

  当我们在写一个和时间相关的程序的时候,我们需要通过每一次的编译和运行获得当前所处的时间,以保证我们程序的正常进行。但是如果有了make的这一项功能,我们会发现我们的代码永远得不到我们想要的结果。

  但是拥有这个功能又可以很大程度上减少我们系统的占有时间,避免进行过多不必要的操作。所以就有了我们.PHONY的修饰,当我们的代码在编译的时候不想被系统所干预,就可以使用该修饰符进行修饰。

  调用make指令执行相应的命令:

  要想执行我们在makefile文件当中编写的命令,我们就只需要使用make指令执行,但是我们会发现的是:使用make指令执行的只是第一个可以编译的指令,如果存在依赖文件就会向后查找并执行产生依赖文件的命令。

  如果想执行后面单独的命令的话就像是我们上面存在的clean指令一样,我们需要特定指出。例如:make clean之后我们的命令才可以正常运行。

http://www.lryc.cn/news/177405.html

相关文章:

  • OpenCV中的HoughLines函数和HoughLinesP函数到底有什么区别?
  • Xilinx FPGA 程序固化重新上电程序不运行的问题
  • c++ 使用rapidjson对数据序列化和反序列化(vs2109)
  • 4.迭代最近点ICP及非线性优化求解
  • 【redis总结】
  • 图数据库:释放关系的力量
  • Windows系统如何临时关闭“Windows安全中心实时保护”
  • 二叉树MFC实现
  • Nginx之客户并发数限制解读
  • 白捡一个存储型XSS
  • SpringMVC 学习(五)转发,重定向和传参
  • selenium不定位元素直接使用键盘操作(如弹框操作)
  • Inno Setup安装中文语言
  • 【数据库——MySQL】(10)视图和索引
  • No servers available for service: renren…。 Gateway 网关报503错误 ,已解决
  • 【Spring Cloud】深入理解 Eureka 注册中心的原理、服务的注册与发现
  • 添加路径到头文件默认搜索路径
  • 掌动智能:替代JMeter的压力测试工具有哪些
  • Casper Network 构建企业级区块链生态的野望
  • TiDB 7.1.0 LTS 特性解读丨关于资源管控 (Resource Control) 应该知道的 6 件事
  • Django Web开发入门基础
  • Baumer工业相机堡盟工业相机如何通过BGAPI SDK设置相机的图像剪切(ROI)功能(C#)
  • LetCode算法题---第2天
  • Leetcode.2571 将整数减少到零需要的最少操作数
  • 微前端无界 项目使用记录
  • CDH 6.3.2升级Flink到1.17.1版本
  • 基于谷歌Transeformer构建人工智能问答系统
  • 【2023年11月第四版教材】第15章《风险管理》(合集篇)
  • python常见面试题四
  • stm32无人机-飞行力学原理