Linux项目自动化构建工具-make/Makefile使用

news2024/11/27 4:28:09

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就会发现报错。

image-20231105102624286

​ 原因是我们对code.c编译过一次后并没有对原文件进行修改,重新编译也是浪费时间和资源,所以就不会再帮我们重新编译了。但如果我们对myexe加上.PHONY修饰的话,就可以无视拦截。

​ 这种拦截可以提高编译效率,对于大型项目如果我们只修改了一个小文件就要把整个项目重新编译一遍就有点浪费时间了,这种情况下只需要重新编译修改了的文件即可。大部分情况下没问题,问题的产生不仅仅是修改新文件就能解决的,有些历史问题需要重新清理项目才能解决。

​ 那么问题来了,编译器怎么知道我们有没有修改文件呢?

本质是对比源文件和可执行文件的修改时间,因为一定是现有源文件才有可执行文件,当源文件的修改时间 < 可执行文件的修改时间就说明没有更改,反之则说明更改了源文件内容

文件的ACM时间

​ 一个文件有三种时间(文件=内容+属性)

  • Access:最近一次读取文件的时间
  • Modify:最近一次修改文件内容的时间
  • Change:最近一次修改文件属性的时间

​ 关于ACM时间变化的细节:

  • 一般情况下Modify更改会带动Change一起更改,因为Modify更改会发生文件大小的改变,就相当于更改了文件属性。更改文件的权限此时Change也会变化,因为这些都是对文件属性的更改。

  • Access时间理论上只要是我读取/打开了文件就会发生变化,但实际并不如此,这里有两种情况:

    1. 读取/打开好几次文件Access才会发生变化
    2. 只有修改了文件内容,再读取/打开Access才会发生变化

    造成这种现象的原因是一个文件被查看的频率非常高,每次查看都要更改Access,本质就是访问磁盘,如果是这样那么Linux系统就会充满大量访问磁盘的IO操作变相降低系统效率,所以就对文件的Access时间的更改进行了一些限制

touch [文件名]可以在不更改内容的情况让文件的时间变成最新的。

make/Makefile拓展

推导性

make/makefile具有推导能力,如果当前目标依赖的文件不存在则会向下搜索去找以依赖文件为目标文件的依赖文件(一直套娃),直到某一个目标文件的依赖文件存在,就逐步往回执行依赖方法,如果搜索完了也没有找到就会退出并报错。

变量

makefile里可以设置变量,也可以对变量重新赋值

  1	src=code.c //定义变量
  2 target=myexe
  3 cc=gcc
  4 
  5 
  6 $(target):$(src) //&(变量名)
  7   $(cc) $(src) -o $(target)       
  8 .PHONY:clean
  9 clean:
 10   rm -f myexe

其他

makefile对于目标文件和依赖目标可以用特定符号表示

  1 myexe:code.c
  2   gcc $^ -o $@ //$^代表冒号右边所有文件,$@代表冒号左边所有文件
  3 .PHONY:clean
  4 clean:
  5   rm -f myexe

makemake clean的时候每次都会有打印出指令比较显眼,在依赖方法前加上@即可不显示指令,以及可以写多条依赖方法

  1 myexe:code.c
  2   @gcc $^ -o $@
  3   @echo "编译文件"  
  4 .PHONY:clean      
  5 clean:        
  6   @rm -f myexe    
  7   @echo "清理文件"

image-20231105120604147

​ 以上语法拓展也可以组合使用。

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

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

相关文章

账户权限控制

1.首先配置一个单群组4节点的链 1.1创建操作目录 cd ~ && mkdir -p fisco && cd fisco 1.2下载国内脚本 curl -#LO https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/FISCO-BCOS/FISCO-BCOS/releases/v2.9.1/build_chain.sh && chmod ux bu…

Python算法例7 四数乘积

1. 问题描述 给定一个长度为n的数组a和一个正整数k&#xff0c;从数组中选择四个数&#xff0c;要求四个数的乘积小于等于k&#xff0c;求方案总数。 2. 问题示例 给定n5&#xff0c;a[1&#xff0c;1&#xff0c;1&#xff0c;2&#xff0c;2]&#xff0c;k3&#xff0c;返…

R语言 复习 习题图片

这是日天土申哥不知道从哪淘来的R语言复习知识点图片&#xff0c;大部分内容都是课后习题的答案 加油吧&#xff0c;骚年&#xff0c;考个好分数

【重学C++基础知识笔记】详细版

基础 常量 C++ 中有两种简单的定义常量的方法: 使用#define,如:#define PI 3.1415926;使用const, 如:const double PI = 3.1415926;注明: 尽量使用const定义变量,#define不会出现在编译器期 #define ASPECT RATIO 1.653 // 在编译时出错,很难排错const doubl…

windows自动登陆

新建文本粘贴下面代码&#xff0c;另存为注册表文件 Windows Registry Editor Version 5.00[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Driver Signing] "Policy"hex:00[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon]"DefaultUserN…

04 矩阵乘法与线性变换复合

矩阵乘法与线性变换复合 复合变换 这是关于3Blue1Brown "线性代数的本质"的学习笔记。 复合变换 图1 复合变换 复合变换原则&#xff0c;依次变换&#xff0c;即先变换的矩阵乘待变换的向量后&#xff0c;得到的结果&#xff0c;再用后变换的矩阵乘此结果向量。从矩…

SPSS多因素方差分析

前言&#xff1a; 本专栏参考教材为《SPSS22.0从入门到精通》&#xff0c;由于软件版本原因&#xff0c;部分内容有所改变&#xff0c;为适应软件版本的变化&#xff0c;特此创作此专栏便于大家学习。本专栏使用软件为&#xff1a;SPSS25.0 本专栏所有的数据文件请点击此链接下…

CleanMyMac X2024登录激活码

本篇将为各位小伙伴们集中讲解一下&#xff0c;Mac清理工具CleanMyMac X的下载、安装与激活是如何进行的。 系统&#xff1a;macOS 10.14&#xff08;在10.15以及Big Sur中的安装激活教程相同&#xff09; 下载CleanMyMac X 登录CleanMyMac X下载页面&#xff0c;然后点击【…

3、Sentinel 动态限流规则

Sentinel 的理念是开发者只需要关注资源的定义&#xff0c;当资源定义成功后可以动态增加各种流控降级规则。Sentinel 提供两种方式修改规则&#xff1a; • 通过 API 直接修改 (loadRules) • 通过 DataSource 适配不同数据源修改 通过 API 修改比较直观&#xff0c;可以通…

sql基础+考点+题

查询&#xff1a;select from 筛选&#xff1a;where and和or 排序&#xff1a;order by&#xff08;降序排列需要指定DESC关键字&#xff09; join&#xff1a;left join 、right join 和inner join 分组聚合&#xff1a;group by ---搭配count , sum , avg 过滤&#x…

2023年中国自然语言处理行业研究报告

第一章 行业概况 1.1 定义 自然语言处理&#xff08;Natural Language Processing&#xff0c;简称NLP&#xff09;是一门交叉学科&#xff0c;它结合了计算机科学、人工智能和语言学的知识&#xff0c;旨在使计算机能够理解、解释和生成人类语言。NLP的核心是构建能够理解和…

Ubuntu 创建用户

在ubuntu系统中创建用户&#xff0c;是最基本的操作。与centos7相比&#xff0c;有较大不同。 我们通过案例介绍&#xff0c;讨论用户的创建。 我们知道&#xff0c;在linux中&#xff0c;有三类用户&#xff1a;超级管理员 root 具有完全权限&#xff1b;系统用户 bin sys a…

MinIO 分布式文件(对象)存储

简介 MinIO是高性能、可扩展、云原生支持、操作简单、开源的分布式对象存储产品。 在中国&#xff1a;阿里巴巴、腾讯、百度、中国联通、华为、中国移动等等9000多家企业也都在使用MinIO产品 官网地址&#xff1a;http://www.minio.org.cn/ 下载 官网下载(8.4.3版本)&#x…

云计算实战项目之---学之思在线考试系统

简介&#xff1a; 学之思开源考试系统是一款 java vue 的前后端分离的考试系统。主要优点是开发、部署简单快捷、界面设计友好、代码结构清晰。支持web端和微信小程序&#xff0c;能覆盖到pc机和手机等设备。 支持多种部署方式&#xff1a;集成部署、前后端分离部署、docker部…

MySQL Too Many Connections

一、前言 上一篇 《磁盘爆了》 我们讲磁盘撑爆造成Java应用无法启动&#xff0c;今天我们来讲一下MySQL连接被撑爆应用启动后连不上数据库的问题。 二、max_connections配置 我们自己安装的开源MySQL5.6 默认的max_connections(最大连接数)值为151&#xff0c;为什么是151咱…

【MongoDB】索引 - 数组字段的多键索引

数组字段创建索引时&#xff0c;MongoDB会为数组中的每个元素创建索引键&#xff08;多键索引&#xff09;&#xff0c;多键索引支持数组字段的高效查询。 一、准备工作 这里准备一些数据 db.shop.insertMany([{_id: 1, name: "水果店1", fruits: ["apple&qu…

Vue+OpenLayers从入门到实战进阶案例汇总目录,兼容OpenLayers7和OpenLayers8

本篇作为《VueOpenLayers入门教程》和《VueOpenLayers实战进阶案例》所有文章的二合一汇总目录&#xff0c;方便查找。 本专栏源码是由OpenLayers结合Vue框架编写。 本专栏从Vue搭建脚手架到如何引入OpenLayers依赖的每一步详细新手教程&#xff0c;再到通过各种入门案例和综合…

Go语言与Python语言的性能比较

目录 一、背景与意义 二、执行速度 三、内存消耗 四、并发性能 五、编译速度与开发效率 六、综合考虑 七、应用场景 八、未来发展趋势 总结 一、背景与意义 在编程世界中&#xff0c;Go语言和Python语言都占有一席之地。Go语言是由Google开发的&#xff0c;其设计初衷…

GNSS精密解算软件介绍

GAMIT&#xff1a; 美国麻省理工学院&#xff08;MIT&#xff09;和加州大学圣地亚哥分校的海洋研究所&#xff08;SIO&#xff09;开发的GAMIT/GLOBK软件&#xff0c; GAMIT为双差网解&#xff0c;利用双差直接消除卫星及测站的时间误差。 gamit软件介绍-周命端&#xff1a;…

Technology strategy Pattern 学习笔记4 - Creating the Strategy-Corporate Context

Creating the Strategy-Corporate Context 1 •. Stakeholder Alignment 1.1 要成功&#xff0c;要尽可能获得powerful leader的支持 1.2 也需要获得最高执行层的支持 1.3 Determining&#xff08;确定&#xff09; Stakeholders 需要建立360度组织图&#xff0c;确认三类人…