【Linux】make/makefile自动化构建工具

news/2024/11/18 16:30:01/

文章目录

  • 前言
  • 一、什么是make/makefile?
  • 二、依赖关系和依赖方法
    • 2.1 makefile中创建文件
    • 2.2 makefile中删除文件
    • 2.3 stat指令查看文件的三种时间(ACM)
    • 2.4 伪目标文件(.PHONY)
  • 三、Makefile中的一些特殊符号
    • 3.1 $@ 和 $^
    • 3.2@特殊符号
  • 总结


前言

本文章讲解Linux下的自动化构建工具:make/makefile


以下是本篇文章正文内容

一、什么是make/makefile?

  • 1.make是一条指令
  • 2.makefile是一个当前目录下的文件

二、依赖关系和依赖方法

2.1 makefile中创建文件

上代码解释什么是依赖关系和依赖方法

1 mycode:mycode.c
2     gcc -o mycode mycode.c   

先创建打开makefile文件,输入上面的代码。

  • 第一行代码的mycode在冒号左边,mycode.c在冒号右边,这一行叫做依赖关系
    mycode依赖于mycode.c。
  • 第二行代码开头需要空一个Tab键,这是语法规定。依赖关系所属的就叫做依赖方法

make指令会自动根据依赖关系和依赖方法生成对应的目标可执行程序。

为了进一步说明依赖关系和依赖方法,以下代码仅仅是为了说明,实际不建议这样写:

  1 mycode:mycode.o2     gcc -o mycode mycode.o                                                      3 mycode.o:m mycode   4     gcc -o mycode.o -c mycode.s5 mycode.s:mycode.i6     gcc -o mycode.s -S mycode.i7 mycode.i:mycode.c8     gcc -o mycode.i -E mycode.c

我们看到,这里又多种依赖关系和依赖方法。
其中,当我们退出makefile文件,直接执行make指令后,情况如下:在这里插入图片描述
这跟我们定义的依赖关系和依赖方法的顺序相反了!
在这里插入图片描述

实际上,make指令在扫描makefile文件时,会先找到第一个生成可执行目标程序,也就是mycode,然而,在当前目录中没有mycode的依赖关系:mycode.o,所以make会继续向下扫描,找到mycode.o的依赖关系:mycode.s,在当前目录下也没有mycode.s,make继续向下扫描,找到mycode.s的依赖关系:mycode.i,当前目录也没有mycode.i,则继续向下找mycode.i的依赖关系:mycode.c。此时找到了mycode.c,就会执行这份依赖关系所对应的依赖方法,也就是第8行的代码。自此从下往上一步步执行,直到生成第一个可以执行目标文件。
所以,只输入make命令,会默认找到第一个依赖关系。

所以我们在makefile文件中打乱各种依赖关系和依赖方法的顺序是可以的,只要能够被make指令查找到即可。

2.2 makefile中删除文件

我们生成了可执行程序后,假如我想把这过程的文件都删除了,可以在makefile文件中添加一个依赖关系和依赖方法,用来删除文件。

 clean:rm -f mycode mycode.i mycode.s mycode.o

执行make clean指令后,上面这些文件都会被删除。
在这里插入图片描述
可以看到,当我们执行完成后,mycode.i,mycode.s,mycode.o文件都会被删除。
这里有个问题:为什么需要输入make clean,而不是直接输入clean?
因为make指令默认寻找的是第一条依赖关系

第二个问题:当我第一次输入了make生成了一堆目标文件后,再次输入make,它就不给我执行了:
在这里插入图片描述
他说mycode是最新的,这是什么原因呢?

2.3 stat指令查看文件的三种时间(ACM)

我们使用

stat mycode

指令,查看mycode后,会出现三种时间

在这里插入图片描述
Access时间(访问时间)Modify时间(更改时间) Change时间:(改变时间)

这里的Modify和Change时间如何区分呢?
还记得

文件 = 文件内容 + 文件属性

Modify时间就是修改文件内容后,会更新到最新时间。
Change时间是修改文件属性后,会更新到最新时间。

Access是访问时间,一般只要我们打开一个文件,该文件的Access时间都会更新到最新时间。

那么为什么多次make,它不让执行呢?

为了提高编译效率。先有源文件,才有可执行,一般而言,源文件的最近修改时间比可执行程序要老。如果我们更改了源文件,历史上还曾经有可执行程序,那么源文件的最近修改时间,一定要比可执行程序新!
只需要比较源文件最近修改时间和可执行程序最近修改时间:
(1).exe 老于 .c文件,需要重新编译
(2).exe 新于 .c文件,不需要重新编译

实际上,我们拿这段代码到Linux上编译时,每次访问.c文件,都会发现,Access并不是每一次都更改!

原因:因为每一次更改Access的值,都需要到磁盘上更新,频繁地访问外设只会让整机的效率变低,Linux的设计者为了提高效率,可能是通过没隔几次Modify或Changed变了,Access才会更新。

可是,如果我就想让make每次都会执行呢?

2.4 伪目标文件(.PHONY)

这里就有一个伪目标文件如下,可以让make一直执行。

在这里插入图片描述
可以看到,当我们在.PHONY:后面加上可执行目标文件后,我们每次执行make,它都会执行,不会因为.exe文件比.c文件新就不执行。

但是实际中建议伪目标代码:.PHONY修饰clean,让clean一直可被执行。
因为有些编译器对增加的代码是叫做增量编译的执行方式,可能源文件的问题依 旧存在,我们需要强制清理,这就需要clean每次都被执行最好。

三、Makefile中的一些特殊符号

3.1 $@ 和 $^

在这里插入图片描述

有时候我们不想在依赖方法中写一大串东西,所以" $@ “符号可以代替依赖关系中,冒号前面所有的东西,也就是可以代替上述案例的mycode,” $^ "可以代替依赖关系中,冒号后面所有的东西,也就是mycode.o

在这里插入图片描述

所以可以这样操作。

3.2@特殊符号

有时候我们不想执行make命令后,下面跟着一大串的依赖关系。我们可以使用@符号加在依赖方法中,让它每次执行make命令后,不再冒出依赖方法。

在这里插入图片描述

总结

今天讲解了Linux的自动化构建工具。


http://www.ppmy.cn/news/1041471.html

相关文章

【Odroid C4】交叉编译工具链安装以及QT交叉编译环境搭建

【Odroid C4】交叉编译工具链安装以及QT交叉编译环境搭建 虚拟机环境,UBUNTU20.04 文章目录 【Odroid C4】交叉编译工具链安装以及QT交叉编译环境搭建一、Odroid C4交叉编译工具链安装二、QT下载及编译安装1.QT下载2.交叉编译QT 配置QtCreator可以[参考](https://bl…

vue 使用插件高德地图--vue-amap

第一步:安装 vue-amap npm install vue-amap第二步:在你的 Vue 项目中注册 vue-amap: // main.js import Vue from vue; import VueAMap from vue-amap;Vue.use(VueAMap);VueAMap.initAMapApiLoader({// 高德开发者平台申请key值key: cc9c098…

java把数字转换成汉字 java 数字转汉字

使用java将数字转化为中文汉字_java数字转中文_javaerly的博客-CSDN博客 package com.unicom.apartment.utils;public class NumUtil {public static String convert(int number) {if(number < 0){return "";}if(number 1){return "当天";}//数字对应的…

FreeRTOS 从入门到精通-任务调度

初写FreeRTOS 从入门到精通系列文章之初&#xff0c;笔者只是当作可以随时回顾的学习笔记来写&#xff0c;并没有想到这些偏技术的文章收获了意料之外的阅读量和关注。首先当然很欣喜自己的文章能够得到了读者们的认可&#xff0c;但同时也有种使命感&#xff0c;既期望启迪并与…

测试平台的周期性任务(定时任务)设计.

因为我们使用java语言,所以选择了java中最流行的quartz框架 周期性任务配置 启用周期性任务后,前端提供表单, 用户配置: 定时任务的开始结束时间, 循环方式 按照每天或者每个月 或者每个星期, 没分钟 每个时间段下,有二级菜单, 例如, 每x分钟,的第x秒 每x小时 的第y分钟z秒 按…

浅谈SpringBoot启动流程

手写SpringCloud项目地址&#xff0c;深入理解微服务核心原理. github:https://github.com/huangjianguo2000/spring-cloud-lightweight gitee:https://gitee.com/huangjianguo2000/spring-cloud-lightweigh 序目 SpringBoot启动流程就是创建IOC容器的过程。 版本不一样&am…

批量删除文件名前的数字编号?

批量删除文件名前的数字编号&#xff1f;如果你在网上经常下载文件&#xff0c;你会发现下载的文件名称前面一般都会有很的数字编号&#xff0c;这些数字编号有时候会非常的长&#xff0c;导致文件的名称也非常的长&#xff0c;这样对于文件的管理和查找使用是不利的。所以为了…

无监督学习之主成分分析-半导体制造高维数据如何降维

数据降维不只存在于半导体数据中&#xff0c;它是存在于各行各业的&#xff0c;我们要分析的数据维数较多的时候全部输入维数较大这时就要采取降维的方法综合出主要的几列用于我们的分析。 PCA的哲学理念是要抓住问题的主要矛盾进行分析&#xff0c;是将多指标转化为少数几个…