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

【Linux】自动化构建工具makefile

目录

背景

makefile简单编写

.PHONY

makefile中常用选项

makefile的自动推导

背景

        会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力 ​

        ◉ 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作 ​

        ◉ makefile带来的好处就是——”自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。

        ​ ◉ make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。

         ◉ make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。

makefile简单编写

makefile主要由两部分组成:a.依赖关系,b.依赖方法

首先我们创建并打开makefile文件

vim makefile

接着我们编写内容

 

Test1.c内容

                           

此时目录下有我们刚刚创建的文件,接着我们执行make命令

 

.PHONY

那如果我们想清理某个文件,该怎么写呢?既然是清理文件那还需要依赖什么文件删除吗?

这个时候需要用一个东西叫 .PHONY伪目标.

因为我们clean目的是清除某些文件,而删除操作又不会需要依赖文件,所以会创建一个伪目标,相当于依赖这个伪目标,然后执行依赖方法.

格式如下:

        1.先在前面写一个.PHONY:clean

        2.第二行紧接着输入clean:

        3.Tab键开头,然后输入依赖方法 rm -rf mytest

 

然后我们使用一下它,执行 make clean我们就会发现mytest被删除了

注意:如果我们不修改test1.cpp文件代码,持续make会发生如下情况:当前可执行程序已是最新版本

 

但是我们确可以一直执行make clean

原因就是.PHONY的作用

在makefile中如果我们想无限执行mytest,只需将.PHONY:目标文件 即可

 

无限执行mytest并不好,之前在未修改原文件,持续执行mytest会造成运行效率低下,一个文件未被修改,持续生称mytest给编译器造成无用的负担。但是可以无限执行clean,因为清理还是很有必要的。那么编译器是怎么知道我的可执行程序是最新的呢?--> 根据文件的最新修改时间

stat可以查看一个文件重要的三个时间

❍ Access:最近的访问时间.

❍ Modify: 最近的内容修改时间,比如你修改了文件的内容,这个时间就会改变.

❍ Change:最近的属性修改时间,比如你修改了这个文件的读写权限,这样它的属性修改时间就会被修改.

一个文件是由内容+属性组成,如果文件内容被修改,那么文件的大小也会被修改,相应的属性修改时间也会改变,并且可执行文件形成的时间一定比源文件晚(这是操作顺序的原因),所以只需要比较两者的时间,只要可执行文件的时间比源文件晚,就说明这个可执行文件一定是最新的

那么如果只执行make,它执行的是makefile中的哪一段语句呢?

默认执行的是第一个依赖关系和依赖方法

我们来验证一下这个道理:我们通过交换clean 与 mytest来验证

此时我们就可以使用make 执行clean了

 

makefile中常用选项

我们先编辑makefile中的内容

test.c内容

#include<stdio.h>
int mian(){printf("hello Wuxu\n");return 0;
}

makefile内容

 

测试输出:

 

说明:

1️⃣ makefile支持定义变量,这是一门解释性语言,无需像C语言那样 int a = 10;

2️⃣ $可以理解为取出对象$@ 是一个特殊变量,它代表当前规则的目标文件名;$^ 是一个特殊的宏,它代表当前规则的所有前置条件(即依赖文件列表)

3️⃣ 通过观察可知,echo是用来打印内容的,但是在这个echo中,$(src) $(bin)会被替换打印

4️⃣ 如果我们执行make/clean语句,不想打印出相关信息,可以在依赖方法前加@表明@:在命令前使用@可以阻止make打印这条命令

 此时只会打印echo语句执行的命令了

makefile的自动推导

我们先完整执行一下makefile

 

通过代码与执行语句我们可以发现make/makefile会自动根据文件中的依赖关系,进行自动推导,帮助我们执行所有相关的依赖方法

注意:

1️⃣ 语句第一条必须是最终结果,如果最终目标颠倒顺序,程序不可执行

2️⃣ 除了最终结果代码之外,其余的可以随意调换位置

3️⃣ 整个推导过程是递归的,与栈类似

 


http://www.mrgr.cn/news/8235.html

相关文章:

  • 【lua实战】lua中pairs和ipairs的区别
  • 末代皇帝Intel核显黑苹果,NUC10的性能到底有多强
  • 【系统架构设计师】论文:论软件开发平台的选择与应用
  • 01-开篇:重新认识 bpmn.js 与 BPMN 规范
  • Add and Multiply Queries
  • 云计算第二阶段---DBA Day05-DAY07
  • 【Material-UI】深入探讨Radio Group组件的自定义功能
  • 算法刷题笔记 筛质数(详细注释的C++实现,同时包含朴素筛法、埃氏筛法和线性筛法详细介绍)
  • JavaScript 数据结构 ==== 二叉树
  • 「蓝桥·算法双周赛」第十七场分级赛——小白入门赛 ——前四道题
  • 如何优雅的实现CRUD,包含微信小程序,API,HTML的表单(一)
  • 使用Qt+Visual Stuidio写一个简单的音乐播放器(1)
  • 回归预测|基于北方苍鹰优化最小二乘支持向量机的数据预测Matlab程序NGO-LSSVM 多特征输入单输出 含基础程序
  • Django后端架构开发:缓存机制,接口缓存、文件缓存、数据库缓存与Memcached缓存
  • 计算机网络原理试卷2017年10月
  • 深度学习 回归问题
  • 图形化的Agent工具
  • 全国上市公司网络安全风险指数(2001-2023年)
  • 【JAVA基础】字符串
  • 【功能自动化】进阶版——使用mysql数据表获取参数,并批量更新数据