Linux自动化构建项目工具——Makefile/makefile

目录

一,背景知识

二,makefile/Makefile的编写

1.创建makefile/Makefile文件

 2.在Makefile文件里写编译代码

3.伪目标——.PHONY

1.伪目标的特点

 2.怎样实现总是被执行

4.Makefile/makefile文件的不同编写风格

1.背景知识

2.改写


一,背景知识

首先我们要分清楚的便是这两个东西的本质区别。我们要明确的便是:

1.make是一个命令

2.makefile/Makefile是一个具有特定格式的文本文件。

在Linux下一个程序员是否会使用Makefile/makefile决定了这个程序员是否具备构建大项目的能力。

二,makefile/Makefile的编写

1.创建makefile/Makefile文件

在想要使用这个工具来达到我们的目的时首先便要创建一个文本文件。这个文本文件只能叫做makefile/Makefile。若是文件名字错了这个工具便是不能被使用的。创建文件:

一般在使用这个工具时创建的是Makefile。

 2.在Makefile文件里写编译代码

1.准备工作:在往Makefile文件里写指令时首先便要写的便是依赖关系。这个依赖关系指的便是源文件与目标文件的关系。目标文件的生成靠的就是源文件。所以我们要先写一个源文件。

所以我们首先写一个源文件并在里面写上一些代码:

接下来便是写Makefile文件的内容了,代码如下:

在这个代码里面这几条代码的对应关系如下:

当我们运行时使用一个make便可以编译文件text.c:

当要清除这个文件时便要用到指令make clean:

在这里如果你想不想要显示make与make clean下面的指令的话便可以在指令前面加上一个@:

之后使用make与make clean指令时便是这样的:

3.伪目标——.PHONY

1.伪目标的特点

1.首先我们要知道的便是伪目标是没有依赖关系的,所以前面的clean是这样子写的:

2.伪目标文件是总是被执行的。比如我的make指令在创建完了一个目标文件后若再次想重新编译便会出现这样的情况:

但是伪目标clean便可以多次执行而不会报错:

 2.怎样实现总是被执行

.PHONY:实现总是被执行的的操作的方法便是不管文件是否修改都要访问磁盘。

这里的修改包括属性修改与内容修改。那我们怎么判断文件是否被修改呢?答案便是通过文件的修改时间判断文件新旧然后判断是否被修改。这里的时间便是ACM时间。可以用指令stat+文件名查看:

这ACM时间便对应的是Access ,Modify,Change时间。在这里Modify时间表示的是文内容被修改的时间,Change表示文件属性被修改的时间。在这些时间里只有Modify时间是牵一发而动全身的,Access时间有可能访问好几次都不变,Change时间就比较随意了。

4.Makefile/makefile文件的不同编写风格

1.背景知识

1.在Makefile文件下可以定义变量名。

2.在Linux下$()有解释括号呢放入的变量内容的作用。

2.改写

在知道上面的两个特性以后便可以将Makefile文件的代码改为如下代码:

解释:

在这里再补充一点,$@可以表示冒号左边的变量,$^可以表示冒号右边的变量,所以这个代码又可以改写成为如下版本:

下面的是不能改的,因为clean的冒号两边没有文件。

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

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

相关文章

Pytorch中张量矩阵乘法函数(mm, bmm, matmul)使用说明,含高维张量实例及运行结果

Pytorch中张量矩阵乘法函数使用说明 1 torch.mm() 函数1.1 torch.mm() 函数定义及参数1.2 torch.bmm() 官方示例 2 torch.bmm() 函数2.1 torch.bmm() 函数定义及参数2.2 torch.bmm() 官方示例 3 torch.matmul() 函数3.1 torch.matmul() 函数定义及参数3.2 torch.matmul() 规则约…

Element树形控件使用过程中遇到的问题及解决方法

1.需求1点击编辑按钮&#xff0c;出现修改组织弹窗&#xff0c;且将点击时的组织名称返现在输入框中。 思路是点击编辑按钮&#xff0c;取到节点点击时返回的data信息中的label进行赋值即可。 <el-treestyle"margin-top: 20px":data"organizationTreeData…

2023/9/14 -- C++/QT

作业&#xff1a; 仿照Vector实现MyVector&#xff0c;最主要实现二倍扩容 #include <iostream>using namespace std;template <typename T> class MyVector { private:T *data;size_t size;size_t V_capacity; public://无参构造MyVector():data(nullptr),size(…

【Java 基础篇】深入了解Java中的键值对集合:Map集合详解

Map是Java中常用的数据结构之一&#xff0c;用于存储键值对&#xff08;Key-Value&#xff09;映射。它提供了快速的查找和访问能力&#xff0c;是编程中常用的工具之一。本文将深入介绍Java中的Map集合&#xff0c;包括常见的Map实现类、基本操作、使用示例以及一些重要的注意…

MATLAB入门-矩阵的运算

MATLAB入门-矩阵的运算 本篇文章为学习笔记&#xff0c;课程链接为&#xff1a;头歌 相关知识 常见的矩阵运算有算术运算、关系运算和逻辑运算。MATLAB中的所有变量都是以矩阵的形式存储的&#xff0c;单个变量就相当于一个1*1的矩阵。 算术运算 下面展示的是常见的矩阵之…

【绝㊙️】三年开发内功心得

经典嵌套if-else问题 这个也是老生常谈问题了&#xff0c;不管哪里都能看到。 那如何解决 方法一&#xff08;重要&#xff09;&#xff1a; 如果逻辑分支过多&#xff0c; 即使你不解决嵌套if-slse&#xff0c;至少也要把每个 if的{}里的逻辑抽到一个独立的方法或者工具类…

Gin路由中间件详解

什么是中间件 Gin 中的中间件必须是一个 gin.HandlerFunc 类型,配置路由的时候可以传递多个 func 回调函 数, 最后一个 func 回调函数前面触发的方法 都可以称为中间件。 中间件操作演示 方法一: 直接写在func,回调函数内 r.GET("/middle",func(ctx *gin.Cont…

Tokenview X-ray功能:深入探索EVM系列浏览器的全新视角

Tokenview作为一家领先的多链区块浏览器&#xff0c;为了进一步优化区块链用户的使用体验&#xff0c;我们推出了X-ray&#xff08;余额透视&#xff09;功能。该功能将帮助您深入了解EVM系列浏览器上每个地址的交易过程&#xff0c;以一种直观、简洁的方式呈现地址的进出账情况…

C# 嵌套循环

例子说明 循环遍历xml文件中的信息包括&#xff1a;节点名称&#xff08;一个&#xff09;&#xff0c;节点的串联值&#xff08;一个&#xff09;&#xff0c;节点的属性&#xff08;多个&#xff09; Xml文件 <?xml version"1.0" encoding"utf-8" …

笔记(一)斯坦福CS224W图机器学习、图神经网络、知识图谱

节点和连接构成的图 如何对图数据进行挖掘&#xff1f; 传统机器学习&#xff0c;数据是独立同分布的&#xff0c;解决表格、矩阵、序列等问题 图机器学习处理连接的数据&#xff0c;需要满足以下几个方面&#xff1a; 1、图是任意尺寸输入2、图是动态变化的&#xff0c;有时…

腾讯mini项目-【指标监控服务重构】2023-07-27

今日已办 SigNoz Log Management SigNoz原生支持 OpenTelemetry 来收集日志&#xff0c;SigNoz 在收集器端进行了优化&#xff0c;为SigNoz中的日志添加了不同的功能。 OpenTelemetry 提供了各种接收器和处理器&#xff0c;用于直接通过 OpenTelemetry Collector 或通过 Flue…

里氏替换原则~

里氏替换原则&#xff08;Liskov Substitution Principle&#xff09;是面向对象设计中的一个基本原则&#xff0c;它是由Barbara Liskov提出的。 如果对于每一个类型为Apple的对象1&#xff0c;都有类型为fruit的对象2&#xff0c;使得以fruit定义的所有程序 P 在所有的对象1都…