Linux项目自动化构建工具-make/Makefile使用
make/Makefile使用介绍
make
是一个命令makefile
是一个在当前目录下存在的一个具有特定格式的文本文件
下面我们设计一个场景,实现make
命令对我们code.c
文件进行编译和删除。
1 #include<stdio.h> 2 3 int main() 4 { 5 printf("hello,world!\n");6 return 0; 7 }
以下是makefile
的内容:
1 myexe:code.c //依赖关系2 gcc code.c -o myexe //依赖方法3 .PHONY:clean //clean是伪目标4 clean: //可不写依赖目标5 rm -f myexe //依赖方法
.PHONY
修饰的是伪目标,意思是总是被执行的,依赖方法总是会被执行,不会被任何情况拦截,想执行就执行。我们在命令行输入make
就可以对code.c
文件进行编译,生成myexe
可执行文件,make clean
就可以删除生成的可执行文件myexe
。现实中,有了依赖关系和依赖方法就可以描述清楚一件事情的原因和做法,达到我们的目标。
make
后面跟着目标,只有make
就会执行第一个扫描到的目标的依赖方法。如果我们连续两次make
就会发现报错。
原因是我们对code.c
编译过一次后并没有对原文件进行修改,重新编译也是浪费时间和资源,所以就不会再帮我们重新编译了。但如果我们对myexe
加上.PHONY
修饰的话,就可以无视拦截。
这种拦截可以提高编译效率,对于大型项目如果我们只修改了一个小文件就要把整个项目重新编译一遍就有点浪费时间了,这种情况下只需要重新编译修改了的文件即可。大部分情况下没问题,问题的产生不仅仅是修改新文件就能解决的,有些历史问题需要重新清理项目才能解决。
那么问题来了,编译器怎么知道我们有没有修改文件呢?
本质是对比源文件和可执行文件的修改时间,因为一定是现有源文件才有可执行文件,当源文件的修改时间 < 可执行文件的修改时间就说明没有更改,反之则说明更改了源文件内容
文件的ACM时间
一个文件有三种时间(文件=内容+属性)
- Access:最近一次读取文件的时间
- Modify:最近一次修改文件内容的时间
- Change:最近一次修改文件属性的时间
关于ACM时间变化的细节:
一般情况下Modify更改会带动Change一起更改,因为Modify更改会发生文件大小的改变,就相当于更改了文件属性。更改文件的权限此时Change也会变化,因为这些都是对文件属性的更改。
Access时间理论上只要是我读取/打开了文件就会发生变化,但实际并不如此,这里有两种情况:
- 读取/打开好几次文件Access才会发生变化
- 只有修改了文件内容,再读取/打开Access才会发生变化
造成这种现象的原因是一个文件被查看的频率非常高,每次查看都要更改Access,本质就是访问磁盘,如果是这样那么Linux系统就会充满大量访问磁盘的IO操作,变相降低系统效率,所以就对文件的Access时间的更改进行了一些限制
touch [文件名]
可以在不更改内容的情况让文件的时间变成最新的。
make/Makefile拓展
推导性
make/makefile具有推导能力,如果当前目标依赖的文件不存在则会向下搜索去找以依赖文件为目标文件的依赖文件(一直套娃),直到某一个目标文件的依赖文件存在,就逐步往回执行依赖方法,如果搜索完了也没有找到就会退出并报错。
变量
makefile里可以设置变量,也可以对变量重新赋值
1 src=code.c //定义变量2 target=myexe3 cc=gcc4 5 6 $(target):$(src) //&(变量名)7 $(cc) $(src) -o $(target) 8 .PHONY:clean9 clean:10 rm -f myexe
其他
makefile对于目标文件和依赖目标可以用特定符号表示
1 myexe:code.c2 gcc $^ -o $@ //$^代表冒号右边所有文件,$@代表冒号左边所有文件3 .PHONY:clean4 clean:5 rm -f myexe
make
和make clean
的时候每次都会有打印出指令比较显眼,在依赖方法前加上@即可不显示指令,以及可以写多条依赖方法
1 myexe:code.c2 @gcc $^ -o $@3 @echo "编译文件" 4 .PHONY:clean 5 clean: 6 @rm -f myexe 7 @echo "清理文件"
以上语法拓展也可以组合使用。
相关文章:

Linux项目自动化构建工具-make/Makefile使用
make/Makefile使用介绍 make是一个命令makefile是一个在当前目录下存在的一个具有特定格式的文本文件 下面我们设计一个场景,实现make命令对我们code.c文件进行编译和删除。 1 #include<stdio.h> 2 3 int main() 4 { 5 printf("hello,world!…...

【React】03.脚手架的进阶应用
文章目录 暴露webpack配置暴露前后的区别config文件夹:scripts文件夹:package.json 常见的配置修改1.把sass改为less2.配置别名3.修改域名和端口号4.修改浏览器兼容5.处理Proxy跨域 2023年最新珠峰React全家桶【react基础-进阶-项目-源码-淘系-面试题】 …...

WPF开源控件HandyControl——零基础教程
学习Handycontrol的过程中,为后边快速开发,写的零基础教程,尽量看完就可以实践! 参考教程 中文文档:欢迎使用HandyControl | HandyOrg Github代码:https://github.com/HandyOrg/HandyControl 使用教程:WPF-HandyControl安装和使用 - 掘金 安装配置教程 创建wpf项目 …...

chinese-stable-diffusion中文场景文生图prompt测评集合
腾讯混元大模型文生图操作指南.dochttps://mp.weixin.qq.com/s/u0AGtpwm_LmgnDY7OQhKGg腾讯混元大模型再进化,文生图能力重磅上线,这里是一手实测腾讯混元的文生图在人像真实感、场景真实感上有比较明显的优势,同时,在中国风景、动…...

K-均值聚类算法
K-均值聚类算法是一种常用的无监督学习算法,目的是将一组数据点分为 K 个聚类。它的主要思想是通过迭代的方式不断调整聚类中心的位置,使得数据点与最近的聚类中心之间的距离最小。 算法步骤如下: 初始化 K 个聚类中心,可以随机…...

Xbox漫游指南
以Xbox series s为例 开机启动 用手柄连接,注意两颗电池要方向相反插入,虽然里面2个插槽长一样; Xbox APP极其难用,放弃,直接用手柄连接 转区 只需要一个空U盘,大小不限制,格式化为NTPS格式…...

降低毕业论文写作压力的终极指南
亲爱的同学们,时光荏苒,转眼间你们即将踏入毕业生的行列。毕业论文作为本科和研究生阶段的重要任务,不仅是对所学知识的综合运用,更是一次对自己学术能力和专业素养的全面考验。然而,论文写作常常伴随着压力和焦虑&…...

SELECT COUNT( * ) 与SELECT COUNT( 1 ) 区别
在 SQL 中,SELECT COUNT(*) 和 SELECT COUNT(1) 都用于统计符合条件的行数,但它们在具体实现和效率上有一些区别。 SELECT COUNT(*):这是一种常见且通用的写法,它会统计所有符合查询条件的行数,包括所有列,…...

[python 刷题] 1248 Count Number of Nice Subarrays
[python 刷题] 1248 Count Number of Nice Subarrays 题目如下: Given an array of integers nums and an integer k. A continuous subarray is called nice if there are k odd numbers on it. Return the number of nice sub-arrays. 这道题和 1343 Number of S…...

堆叠注入 [GYCTF2020]Blacklist1
打开题目 判断注入点 输入1,页面回显 输入1 页面报错 输入 1 # 页面正常,说明是单引号的字符型注入 我们输入1; show databases; # 说明有6个数据库 1; show tables; # 说明有三个表 我们直接查看FlagHere的表结构 1;desc FlagHere;# 发…...

算法:Java构建二叉树并递归实现二叉树的前序、中序、后序遍历
先自定义一下二叉树的类: // Definition for a binary tree node. public class TreeNode {int val;TreeNode left;TreeNode right;TreeNode() {}TreeNode(int val) { this.val val; }TreeNode(int val, TreeNode left, TreeNode right) {this.val val;this.left…...

既然有了字节流,为什么还要有字符流?
字符流和字节流之间的区别主要在于它们处理数据的方式和用途: 字节流:字节流以字节为单位进行数据的读取和写入,适用于处理二进制数据,如图像、音频和视频文件。字节流是处理底层数据的理想选择,它不会对数据进行编码…...

3+单细胞+代谢+WGCNA+机器学习
今天给同学们分享一篇生信文章“Identification of new co-diagnostic genes for sepsis and metabolic syndrome using single-cell data analysis and machine learning algorithms”,这篇文章发表Front Genet.期刊上,影响因子为3.7。 结果解读&#x…...

音乐推荐与管理系统Python+Django网页界面+协同过滤推荐算法
一、介绍 音乐推荐与管理系统。本系统采用Python作为主要开发语言,前端使用HTML、CSS、BootStrap等技术搭建界面平台,后端使用Django框架处理请求,并基于Ajax等技术实现前端与后端的数据通信。在音乐个性推荐功能模块中采用通过Python编写协…...

(论文阅读15/100)You Only Look Once: Unified, Real-Time Object Detection
文献阅读笔记 简介 题目 You Only Look Once: Unified, Real-Time Object Detection 作者 Joseph Redmon, Santosh Divvala, Ross Girshick, Ali Farhadi 原文链接 https://arxiv.org/pdf/1506.02640.pdf 《You Only Look Once: Unified, Real-Time Object Detection》…...

init进程启动过程
首语 init进程是Android系统中用户空间的第一个进程,进程号为1,是Android系统启动的一个关键步骤,作为第一个进程,它的主要工作是创建Zygote和启动属性服务等。init进程是由多个源文件共同组成的,源码目录在system/co…...

全网最详细的【shell脚本的入门】
🏅我是默,一个在CSDN分享笔记的博主。📚📚 🌟在这里,我要推荐给大家我的专栏《Linux》。🎯🎯 🚀无论你是编程小白,还是有一定基础的程序员,这…...

CH10_简化条件逻辑
分解条件表达式(Decompose Conditional) if (!aDate.isBefore(plan.summerStart) && !aDate.isAfter(plan.summerEnd))charge quantity * plan.summerRate; elsecharge quantity * plan.regularRate plan.regularServiceCharge;if (summer())…...

nn.LayerNorm解释
这个是层归一化。我们输入一个参数,这个参数就必须与最后一个维度对应。但是我们也可以输入多个维度,但是必须从后向前对应。 import torch import torch.nn as nna torch.rand((100,5)) c nn.LayerNorm([5]) print(c(a).shape)a torch.rand((100,5,…...

Springboot搭建微服务案例之Eureka注册中心
一、父工程依赖管理 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org…...

【MySQL】用户管理权限控制
文章目录 前言一. 用户管理1. 创建用户2. 删除用户3. 修改用户密码 二. 权限控制1. 用户授权2. 查看权限3. 回收权限 结束语 前言 MySQL的数据其实也以文件形式保存,而登录信息同样保存在文件中 MySQL的数据在Linux下默认路径是/var/lib/mysql 登录MySQL同样也可以…...

若依框架前后端分离版服务器部署,前端nginx的配置
server {listen 80;server_name 120.46.177.184;index index.php index.html index.htm default.php default.htm default.html;root /www/wwwroot/qilaike-vue/dist;#SSL-START SSL相关配置,请勿删除或修改下一行带注释的404规则#error_page 404/404.html;#SSL-END…...

基于单片机的滚筒洗衣机智能控制系统设计
收藏和点赞,您的关注是我创作的动力 文章目录 概要 一、系统整体设计方案2.1控制系统的功能2.2设计的主要内容 二、硬件设计3.1 控制系统整体框图3.2 电源电路 三 软件设计主程序设计仿真设计 四、 结论 概要 因此我们需要一个完善的智能系统来设计一个全自动滚筒洗…...

简述多模态学习中,对齐、融合和表示
在多模态学习中,对齐、融合和表示是三个核心概念,它们相互关联,共同支持多模态数据的处理和分析。 对齐(Alignment) 对齐是多模态学习中的一个关键步骤,它涉及到如何在不同的数据模态之间发现和建立对应关…...

Kotlin 进阶函数式编程技巧
Kotlin 进阶函数式编程技巧 Kotlin 简介 软件开发环境不断变化,要求开发人员不仅适应,更要进化。Kotlin 以其简洁的语法和强大的功能迅速成为许多人进化过程中的信赖伙伴。虽然 Kotlin 的初始吸引力可能是它的简洁语法和与 Java 的互操作性,…...

操作系统——内存映射文件(王道视频p57)
1.总体概述: 2.传统文件访问方式: 我认为,这种方式最大的劣势在于,如果要对整个文件的不同部分进行多次操作的话,这样确实开销可能会大一些,而且程序员还要指定对应的“分块”载入到内存中 3.内存映射文件…...

王道p18 07.将两个有序顺序表合并为一个新的有序顺序表,并由函数返回结果顺序表。(c语言代码实现)
视频讲解在这:👇 p18 第7题 c语言代码实现王道数据结构课后代码题_哔哩哔哩_bilibili 本题代码如下 int merge(struct sqlist* A, struct sqlist* B, struct sqlist* C) {if (A->length B->length > C->length)//大于顺序表的最大长度r…...

2024最新mac电脑清理垃圾的软件有哪些?
mac电脑是许多人喜爱的电子产品,它拥有优美的设计、流畅的操作系统和强大的性能。但是,随着使用时间的增长,mac电脑也会积累一些不必要的垃圾文件,这些文件会占用宝贵的存储空间,影响电脑的运行速度和稳定性。因此&…...

2023年【山东省安全员C证】考试技巧及山东省安全员C证模拟试题
题库来源:安全生产模拟考试一点通公众号小程序 山东省安全员C证考试技巧考前必练!安全生产模拟考试一点通每个月更新山东省安全员C证模拟试题题目及答案!多做几遍,其实通过山东省安全员C证模拟考试题很简单。 1、【多选题】《环境…...

2024最新免费的mac电脑清理垃圾的软件有哪些?
mac电脑是许多人喜爱的电子产品,它拥有优美的设计、流畅的操作系统和强大的性能。但是,随着使用时间的增长,mac电脑也会积累一些不必要的垃圾文件,这些文件会占用宝贵的存储空间,影响电脑的运行速度和稳定性。因此&…...