Linux -- 认识 make/makefile

news2024/9/26 3:30:57

目录

前言:

什么是 make/makefile?

怎么使用 make/makefile?

依赖关系和依赖方法: 

清理: 

怎么使用 make? 

如何编写多文件的 makefile? 

什么是PHNOY?

ACM时间

什么是ACM时间? 

Access 时间:

Change 时间:

Modify 时间:


前言:

想象一下,在一个大工程中,有大量的文件,每个文件中的代码都需要编译,我们每次编译都要写一大段的 gcc 命令,能不能简化这个重复的工作?答案是能。

什么是 make/makefile?

make 是命令,makefile/Makefile (首字母大小写皆可)是文件,makefile一旦写好了,只需要make 命令,整个工程完全自动编译,这两个搭配使用极大提高了软件开发的效率!

怎么使用 make/makefile?

假设我们现在写了一个代码,如下图所示,代码所在文件的文件名为 test.c :

在使用 make 命令之前,我们必须先写 makefile 文件,写通了 makefile 之后,make 命令才会顺利运行,否则会报错(如下图所示):

在代码所在的文件夹中 touch makefile 文件,创建 makefile 文件,之后 vim makefile,进入编辑模式: 

 

依赖关系和依赖方法: 

在 makefile 文件中,我们需要建立依赖方法和依赖关系

1、mybin:test.c 就是依赖关系,表示 mybin 文件依赖于 test.c,其中 mybin 是目标文件,test.c 是依赖文件列表;

2、gcc test.c -o mybin 就是依赖方法,此处 mybin 是 test.c 编译后生成的可执行程序。

注意依赖关系和依赖方法的格式,依赖方法前面必须空出 tab 键,这是语法要求! 

清理: 

除了创建可执行程序外,还可以提供清理可执行程序的方式:

clean:
    rm -f mybin

怎么使用 make? 

把 makefile 写完之后,输入 make 命令时,就会生成对应的目标文件: 

 

如果文件列表中的文件没有更新,此时 make 命令并不会生成对应的目标文件,会提示目标文件已经更新到最新版本了: 

 

如果我们想清理目标文件,输入 make clean 命令即可! 

 

如何编写多文件的 makefile? 

如果项目有很多文件需要编译,此时 makefile 要怎么写更便捷? 

首先假设我们此时有很多个文件(如下图所示),把这么多的文件一个个敲进 makefile 文件中是很麻烦的一件事,我们可能会忘记文件名,而导致反复退出 vim 模式去查看:

 

ls >makefile 可以把 ls 的输出结果重定向到 makefile 中: 

ls >makefile

  

此时打开 makefile 就会发现所有的文件都在 makefile 里面了,我们就不需要一个一个地把文件敲进去! 删除不需要的文件名后,就可以进行 makefile 的编写。 

 

 $@ 表示目标文件,$^ 表示依赖文件列表:

 

写完 makefile 后,此时输入 make 命令时,会自动把我们省略的部分替换成对应的文件: 

 

makefile 中还可以定义变量,make 时会自动替换,下图中若 src 需要定义多个文件,文件之间用空格隔开即可:

 

 

什么是PHNOY?

PHONY 可以修饰目标文件,让目标文件成为一个伪目标,使得 PHONY 后接的命令总是被执行! 我们一般会让 clean 命令总是被执行。 

.PHONY:clean

 

ACM时间

上面我们提到,如果目标文件已经是最新的了,那么 make 命令不会更新目标文件,那么 make 怎么知道目标文件已经是最新的呢?这就需要提到ACM时间。

什么是ACM时间? 

当我们输入命令 stat  filename  时,可以查看文件的状态信息,信息中包含文件的 Access、Modify、Change时间。

Access 时间:

上一次访问、读取文件的时间

当我们用 cat 查看代码时,实际上就是在访问文件了,Access 时间会随之更新! 

但不是每一次访问文件都会更新 Access 时间,如果短时间内频繁的访问同一个文件,Access 不会立即更新时间,而是累计到一定次数之后才会更新时间,因为频繁地更新时间,会增加系统的负担! 

Change 时间:

上一次修改文件属性的时间(修改文件的大小、权限等) 

Modify 时间:

上一次修改文件内容的时间,由于修改文件的内容也会修改文件的属性,所以修改文件的内容时,Change 时间也会随之改变!

 当我修改了 test.c 的代码时,文件的 Change时间和 Modify 时间都更新了!

make 是通过对比时间来确定可执行程序是否更新了,那么 make 是根据哪个时间来确定可执行程序需要更新了呢?答案是 Modify 时间。

正常来说,源代码创建的时间比可执行程序早,源代码的 Modify 时间也会比可执行程序的 Modify时间早!

如果我们修改了源代码,那么源代码的 Modify 时间就比可执行程序的 Modify时间晚了, make 通过比较 Modify 时间,就知道源代码更新了,此时就会去更新可执行程序!

本文到这里就i结束了,欢迎各位大佬指正!

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

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

相关文章

maven项目读取文件错误

开发工具:idea 一个简单的maven项目,程序读取不到src/main/resources目录下的文件 寻找了一些原因后,还是没解决,最后灵机一动改了设置居然好了。 然后就解决了

LAZYNVIM学习使用笔记

文章目录 1. 前言VIM的模式快捷键参考 1. 前言 习惯使用vscode进行代码编辑,无意中刷到lazynvim,感觉功能强大,于是下载、安装,学习使用一下,本篇主要记录学习使用lazynvim的一些要点,防止遗忘。 持续更新…

视频版权音乐处理☞AI分离人声、音效、背景音乐的需求和进展-2024

随着互联网的普及和短视频的兴起,视频内容的全球各大平台分发越来越普遍。然而,不同国家和地区的音乐版权、不同社媒平台拥有的版权和处理政策都存在差异,因此同一个视频在多渠道分发的时候就会产生版权侵权风险。如何既能满足全球多渠道、多…

【大白话讲清楚:什么是 Langchain 及其核心概念】

文末有福利! 在AI和机器学习领域,每天都有新技术和框架涌现。今天,我们来聊聊最近引起广泛关注的一个框架 —— Langchain。 https://python.langchain.com/docs/get_started/introduction 那么,Langchain到底是什么&#xff0c…

【教程】Hexo 部署到 Github Page 后,自定义域名失效的问题

目录 前言&问题描述解决方案细节 前言&问题描述 近期给 Github Page 上托管的静态网站映射了自定义域名(aiproducthome.top),之后发现每次更新并部署 hexo 到 Github Page (hexo d)后就会出现自定义域名失效的…

Mybatis的优缺点及适用场景?

目录 一、什么是Mybatis? 二、Mybatis框架的特点 三、Mybatis框架的优点? 四、MyBatis 框架的缺点? 五、MyBatis 框架适用场合? 六、代码示例 1. 配置文件 mybatis-config.xml 2. 映射文件 UserMapper.xml 3. Java 代码…

数据结构--二叉树相关性质

1.性质 1.满二叉树每层节点个数:等比数列 3.(重要)任意二叉树:度为0(叶子节点)的比度为2的永远多一个。。度:就是看有多少孩子 如下图解析:(用推到归纳来分析&#xff…

CSS关于居中的问题

文章目录 1. 行内和块级元素自身相对父控件居中1.1. 块级元素相对父控件居中1.2. 行内元素相对于父控件居中 2. 实现单行文字垂直居中3. 子绝父相实现子元素的水平垂直居中3.1. 方案一3.1.1. 示例 3.2. 方案二3.2.1. 示例 3.3. 方案三(推荐)3.3.1. 示例 3.4. 方案四(了解一下) …

【linux】 sudo apt update报错——‘由于没有公钥,无法验证下列签名: NO_PUBKEY 3B4FE6ACC0B21F32’

【linux】 sudo apt update报错——‘由于没有公钥,无法验证下列签名: NO_PUBKEY 3B4FE6ACC0B21F32’ 在运行sudo apt update时遇到报错,由于没有公钥,无法验证下列签名: NO_PUBKEY 3B4FE6ACC0B21F32 解决方法&#x…

Vue 项目中 history 路由模式的使用

在最近帮客户开发的一个项目中,由于项目的特殊性,需要用到 Vue 中的 history路由模式。该模式使用时会涉及到“上传白屏”和“刷新 404 问题”。在帮助客户解决这两个问题的过程中,总结问题的解决方案并记录下来,希望能够保留这篇…

【C++航海王:追寻罗杰的编程之路】关联式容器的底层结构——红黑树

目录 1 -> 红黑树 1.1 -> 红黑树的概念 1.2 -> 红黑树的性质 1.3 -> 红黑树节点的定义 1.4 -> 红黑树的结构 1.5 -> 红黑树的插入操作 1.6 -> 红黑树的验证 1.8 -> 红黑树与AVL树的比较 2 -> 红黑树模拟实现STL中的map与set 2.1 -> 红…

私域流量新纪元:解锁电商增长新引擎

一、私域流量的战略价值再审视 在数字化转型的浪潮中,流量已成为企业生命力的源泉。相较于公域流量的广泛而难以深度触及,私域流量以其独有的专属性和高复用性,为企业搭建起通往用户内心的桥梁。它不仅赋予企业精准营销的能力,还…

Qt:11.输入类控件(QLineEdit-单行文本输入控件、QTextEdit-多行文本输入控件、QComboBox-下拉列表的控件)

一、QLineEdit-单行文本输入控件: 1.1QLineEdit介绍: QLineEdit 是 Qt 库中的一个单行文本输入控件,不能换行。允许用户输入和编辑单行文本。 1.2属性介绍: inputMask 设置输入掩码,以限定输入格式。setInputMask(con…

C#知识|账号管理系统:数据库查询账号类别动态绑定到下拉框。

哈喽,你好啊,我是雷工! 本节学习如何将数据库中账号类别动态添加到下拉框列表中。 以下为学习笔记。 01 类型表 SQLServer数据库LGAccountManagentDB中AccountType表的数据内容为: 该数据库及数据表的创建可以查看: 《 数据库|基于T-SQL创建数据表(练习笔记)》 更多关于…

(一)项目实践-利用Appdesigner制作目标跟踪仿真软件

目录 前言 一、软件页面设计 二、仿真部分 (一)参数输入 (二)绘图部分 (三)目标追踪程序 总结 前言 本博客有一个专栏用来介绍有关MATLAB中的Appdesigner的操作以及使用,本文是为了深化读者对于…

动态规划专题一 斐波那契数问题

目录 题一 最小花费爬楼梯 1、算法解析 1)确定状态: ​编辑2)状态转移方程: ​编辑3)初始化: 4)填表顺序: 5)返回值: 2、代码 题二 第N个泰波那锲数 …

Git 命令行快速入门

前言 (1)新手个人建议使用TortoiseGit这类图形化界面来上手学习。 (2)如果一定需要用命令行进行操作,可以按照B站:程式与网页开发者必备技能!Git 和 GitHub 零基础快速上手,轻松掌握…

odoo模型继承

odoo模型继承 模块化是Odoo一个非常重要的功能。一个模块通常定义一块业务内容,模块之间是可以交互的。所以从已有模块中去继承修改原有模块功能就很有必要。 Odoo中,模型之间也定义了一套继承的逻辑,目前有三种继承方 式: 1、…

学习测试7-ADB的使用

ADB是什么? ADB,即 Android Debug Bridge(安卓调试桥) 是一种允许模拟器或已连接的 Android 设备进行通信的命令行工具,它可为各种设备操作提供便利,如安装和调试应用,并提供对 Unix shell&…

ScrapySharp框架:小红书视频数据采集的API集成与应用

引言 随着大数据时代的到来,数据采集成为了互联网企业获取信息的重要手段。小红书作为一个集社交和电商于一体的平台,其丰富的用户生成内容(UGC)为数据采集提供了丰富的资源。本文将介绍如何使用ScrapySharp框架进行小红书视频数…