初识Linux · 有关makefile

目录

前言:

1 makefile的简单使用

2 makefile介绍


前言:

我们上文介绍了gcc和g++的基本使用,带了许多的子指令,但是有的时候啊,一个一个敲指令确实有点麻烦了,此时,一个工具就能派上用场,即自动化工具makefile。

我们不妨理解为语言中的宏,命令的重新命名都可以通过makefile来表示,这就大大简化了工程量了,所以,有的时候makefile的使用从侧面也决定了工程的完备程序以及效率问题。

通过简单的介绍,我们知道了makefile是一个自动化命令工具,那么使用方法第一个是要创建makefile文件,makefile或者是Makefile都可以,我们在文件里面写入一些指令加上一点操作,我们就可以实现自动化指令了。


1 makefile的简单使用

我们不妨,先看看makefile的简单使用:

第一步是创建一个makefile文件并往里面写入一些指令->后面会介绍。

第二步则是先来一个实例代码:

然后,我们直接make一下,就可以创建一个test的可执行文件了,我们执行也是没有问题的:

其中,clean指令也是可以完成我们的预期操作的。


2 makefile介绍

我们从makefile文件中的第一个点开始:

第一行的test:test.c,其中test:test.c成为构成了依赖关系,test叫做目标文件,test.c是被test依赖的。

其中:后面的叫做依赖文件列表,不同的依赖文件可以用空格进行分割,也可以为空。那么下面的指令就是依赖方法,依赖方法前面只能使用Tab来空位置,不能使用四个空格,会报错。

这的理解我们可以理解为父子,儿子问父亲要钱,这里面存在父子之间的依赖关系,依赖方法是养育,所以给钱。

那么我们如果重复使用该命令呢?

它第一次是成功执行了的,但是后面就告诉说,test is up to date,表明test文件已经是最新文件了。

此时,前面文章埋的伏笔就可以拉出来了->文件的ACM时间

我们首先看看test.c的ACM时间:

这里为什么不让多次执行编译的命令就是因为makefile工具比较的是源文件和可执行文件的ACM时间,如果可执行文件和源文件的ACM时间,在修改上有差别,make检测到源文件更新了,才会重新编译源文件,这样做的目的是提高效率,比如不能总一直编译已经编译好了的文件吧。

以及,不同的自动化工具对于时间的判断是不一样的,比如我们平时使用的VS,有的时候出现bug,重新清理一下解决方案,再运行就可以了,大多数就是因为时间的判断准则出现问题了,此时清空解决方案就是为了更新一下可执行文件的ACM时间,一比较,欸源代码早一点,重新编译就成功了。

但是,前面我们介绍了一个指令叫做touch,是用来创建文件的,好像在这里没有啥用处,但是使用touch可以改变ACM时间:

所以我们想要重复编译也可以使用touch改变ACM时间再进行编译即可。 

此时,再引出一个关键词,.PHONY:

我们会发现clean总是可以执行的,这就是.PHONY做的事,被.PHONY修饰了的指令,默认可以重复执行,所以我们可以重复执行,那么我们同样可以把.PHONY给test修饰了

就可以重复编译了,此时clean也是可以重复执行的,因为clean是特殊的方法,后面也不用跟任何东西:

那么现在来深究原理部分,为什么我们直接make是执行的第一个指令呢?

因为makefile执行方向就是从上往下进行执行的,所以我们直接make,默认执行的是第一个指令,那么我们换个位置:

此时make就是执行的第一个语句了。

此时啊,学到这里,不免会觉得我每次使用指令都要给我打印出来,一点神秘感都没有,能不能不打印呢?

当然是可以的,此时用到的符号是@,@任意的指令,就能让指令不显示出来:

此时make了一下之后,rm -rf之后也没显示:

此时同理。

 

所以@是只能应用一个指令,不是多行的,此时对echo@一下就可以了:

 这里还有一个有意思的点是,makefile里面的注释是#,并且允许变量的存在,虽然说是变量,但是实际上就是宏了:

执行的操作实际上就是替换。

但是这样使用就会导致如上错误。

需要搭配$使用:

此时就没问题了。

这里涉及了替换,我们不妨再看看$@ $^:

不难看出,$@ $^分别代替的是目标文件和依赖文件。

好了,现在又提到了依赖关系,那么,我们看一段代码:

我们不难发现依赖关系是连着的,所以我们可以直接创建编译的三个阶段的文件。

那么既然依赖关系是连着的,试试打乱顺序呢?

 

可以发现,还是可以创建,难道是说随意打乱顺序都没有问题的吗?

当然不是;

此时只能创建预处理期间的文件,可执行文件就创建不了了,凡事都要有一个带头的不是,所以可执行文件要放最开始: 


感谢阅读!

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

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

相关文章

Linux学习-虚拟化平台安装和使用

注:系统使用Rock8.6 下载链接 通过百度网盘分享的文件:cirros.qcow2,node_base.xml等2个文件 链接:https://pan.baidu.com/s/1hupGQsMjrXMgngCy3lQLhw?pwdhlr6 提取码:hlr6[rootharbor ~]# cat /etc/redhat-releas…

Django+Vue宠物服务管理系统的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 需要的环境3.2 Django接口层3.3 实体类3.4 config.ini3.5 启动类3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍:CSDN认证博客专家,CSDN平台Java领域优质创作者&…

2024-09-03作业

作业结果 作业代码 #include <iostream> using namespace std; class RMB { friend const RMB operator-(const RMB &L,const RMB &R); friend const RMB operator--(RMB &O,int); private: int yuan; int jiao; int fen; static…

JMeter 安装使用

JMeter 安装使用 a.安装 下载链接:Apache JMeter - Download Apache JMeter 环境变量 打开 cmd 输入 jmeter&#xff0c;即可启动 b.使用 http请求接口 300 个线程设置 1 s 的预热时间 右键 start

SQL Server Service Broker故障排除

如果你的SQL Server Queue无法正常工作&#xff0c;这可能是由于多种原因造成的&#xff0c;比如设置不正确、SQL Server Service Broker存在问题&#xff0c;或者队列本身有问题。以下是一些故障排除步骤&#xff1a; Check SQL Server Service Broker: 你的队列所在的数据…

Netty Reactor面试连环问

写在文章开头 关于Netty一直是笔者比较感兴趣的框架,针对Reactor线程模型面试时,常常会涉及下面这些问题: 有几种Reactor线程模型?Netty如何实现Reactor模型的?为什么Netty 的main reactor只用到一个线程?Netty分配channel的Nio eventLoop规则是什么?通用模式的NIO多路…

如何读懂以太坊源代码

以下是一个学习以太坊源代码的清晰思路&#xff1a; 一、前期准备 基础知识储备&#xff1a; 熟悉区块链的基本概念&#xff0c;如区块、交易、共识机制、哈希函数等。了解 Go 语言&#xff08;以太坊主要使用 Go 语言编写&#xff09;的基本语法和编程概念。 工具准备&#x…

Unity(2022.3.41LTS) - UI详细介绍-Scroll View(滚动视图)

目录 零.简介 一、基本功能与用途 二、主要组件 Rect Transform&#xff08;矩形变换&#xff09;&#xff1a; Scroll Rect&#xff08;滚动矩形&#xff09;组件&#xff1a; Scrollbar&#xff08;滚动条&#xff09;组件&#xff1a; Mask&#xff08;遮罩&#xff…

今天来聊一聊前端框架有哪些呢? 主流Vue和React

使用工具&#xff1a; 联网搜索 前端框架主要包括React.js、Vue.js、Angular等。在现代网络技术的快速发展中&#xff0c;前端框架成为了实现界面美观、交互性强、用户体验佳的网页和应用不可或缺的工具。下面将具体介绍几款目前主流的前端框架&#xff1a; React.js 简介&…

源代码怎么加密防泄漏?9种方法教会你

想做源代码加密防止泄漏&#xff0c;首先要了解程序员可以通过哪些方式将源代码传输出去&#xff01; 程序员泄密的常见方式 物理方法&#xff1a; — 网线直连&#xff0c;即把网线从墙上插头拔下来&#xff0c;然后和一个非受控电脑直连; — winPE启动&#xff0c;通过光盘…

Learning——protobuf的下载

目录 一、protobuf在windows下安装 1.下载地址 2.配置环境变量 ①打开设置 ②搜索框中搜索编译环境变量 ③ 点击“环境变量” ④ 找到PATH并双击打开编辑 ⑤配置环境变量后点击确定 3.检验是否安装成功 二、protobuf在Linux下安装 1.库依赖安装 2.下载地址 我不能使用…

springboot中的请求过滤filter与拦截interceptor分析

首先我们要定义一个类&#xff0c;实现标准的过滤器 import lombok.extern.slf4j.Slf4j;import javax.servlet.*; import javax.servlet.annotation.WebFilter; import java.io.IOException;WebFilter("/*") Slf4j public class AuthFilter implements Filter {Overr…

class 6: vue.js 3 组件化开发

组件化开发实际上就是问题拆解&#xff0c;分而治之。将页面拆分为一个个小的功能块&#xff0c;每个功能块负责完成属于自己的独立功能&#xff0c;这使得整个页面的管理和维护就变得非常容易了组件化可以简化开发进程&#xff0c;代码复用率更高&#xff0c;并有利于后期维护…

动态规划-最大子数组和

最大子数组和 题目描述 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。子数组是数组中的一个连续部分。 53. 最大子数组和 - 力扣&#xff08;LeetCode&#xff09; 示例…

在Nginx上部署前端Vue项目,超级简单!!

Nginx&#xff08;engine x&#xff09; 是一个高性能的HTTP和反向代理web服务器&#xff0c;同时也是一个IMAP/POP3/SMTP代理服务器。 Nginx因其高性能、可扩展性、灵活性和免费开源等优势&#xff0c;在现代Web架构中得到了广泛应用。无论是作为Web服务器直接提供服务&…

Elasticsearch 索引模板

文章目录 前言Elasticsearch 索引模板1. 作用2. 示例3. 查询索引模板4. 测试 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff0c;实在白嫖的…

validationtools中按键测试选项光标移除

最近处理一个问题&#xff0c;设备有方向键盘&#xff0c;做cit中的按键测试&#xff0c;发现按方向键第一次按键不能触发该键值&#xff0c;而是让屏幕第一个按钮获取焦点&#xff0c;然后再次按键&#xff0c;则其他正常。问题&#xff1a;进入界面第一次按键就要响应对应按键…

html+css+js网页设计 故宫7个页面 ui还原度100%

htmlcssjs网页设计 故宫7个页面 ui还原度100% 网页作品代码简单&#xff0c;可使用任意HTML编辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&#xff09;。 获取源码 1…

sqlite3的db.interrupt方法深入解析

在Node.js环境中&#xff0c;sqlite3库是一个广受欢迎的轻量级数据库库&#xff0c;它为开发者提供了一个简洁的API来与SQLite数据库进行交互。在处理长时间运行或复杂的数据库查询时&#xff0c;有时可能需要中断这些查询。sqlite3库提供了db.interrupt方法来实现这一功能。本…

Anaconda安装和环境配置教程(深度学习准备)

目录 1.下载选择 2.prompt配置 3.虚拟环境配置 4.检查是不是安装成功 5.安装jupter 6.关闭anaconda重新进入 7.总结 1.下载选择 我第一次使用的这个官网上面的邮箱的方式下载的&#xff0c;但是这个方式真的特别慢&#xff0c;于是用了这个清华的镜像网站&#xff0c;网…