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

文章目录

  • 前言
  • 一、什么是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.o
  2     gcc -o mycode mycode.o                                                      
  3 mycode.o:m mycode   
  4     gcc -o mycode.o -c mycode.s
  5 mycode.s:mycode.i
  6     gcc -o mycode.s -S mycode.i
  7 mycode.i:mycode.c
  8     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的自动化构建工具。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据结构 | 堆

本文简要总结堆的概念。 更新:2023 / 8 / 20 数据结构 | 堆 堆概念方法插入步骤 删除步骤 示例大根堆堆插入删除堆排序 代码实现Python大根堆1.2. heapq 小根堆1.2. heapq 参考链接 堆 概念 如果谈到堆排序,那么必然要说说什么是 大根堆 max heap 和 …

函数极限与连续性——张宇老师学习笔记

Latex 源代码以及成品PDF(Debug版本):https://wwsk.lanzouc.com/itaDI15vddcb Latex编译Debug版本: $ xelatex 函数极限与连续性.texLatex编译Relese版本(无例题、习题,只有概念定义)&#xf…

arm:day4

1. 实现三盏灯的点亮 .text .global _start_start: led1初始化函数LED_INIT: 1 通过RCC_AHB4_ENSETR寄存器&#xff0c;设置GPIOE F组控制器使能 0x50000A28[5:4]1ldr r0,0X50000A28ldr r1,[r0]orr r1,r1,#(0X3<<4)str r1,[r0] 2.1 通过GPIOE_MODER寄存器&#xff0c;…

FFmpeg5.0源码阅读——VideoToobox硬件解码

摘要&#xff1a;本文描述了FFmpeg中videotoobox解码器如何进行解码工作&#xff0c;如何将一个编码的码流解码为最终的裸流。   关键字&#xff1a;videotoobox,decoder,ffmpeg   VideoToolbox 是一个低级框架&#xff0c;提供对硬件编码器和解码器的直接访问。 它提供视频…

RabbitMq-2安装与配置

Rabbitmq的安装 1.上传资源 注意&#xff1a;rabbitmq的版本必须与erlang编译器的版本适配 2.安装依赖环境 //打开虚拟机 yum install build-essential openssl openssl-devel unixODBC unixODBC-devel make gcc gcc-c kernel-devel m4 ncurses-devel tk tc xz3.安装erlan…

第3天----在一行句子中寻找最长最短单词

今天我们将学习如何在一行句子中寻找(第一次出现的)最长最短单词。本节内容会或多或少地利用到第一讲/第二讲的知识点&#xff0c;需要的同学可以先去看看前面的内容。 一、小试牛刀&#xff1a; 题目描述 输入 1 行句子&#xff08;不多于 200 个单词&#xff0c;每个单词长度…

Spring学习笔记+SpringMvc+SpringBoot学习笔记

壹、核心概念&#xff1a; 1.1. IOC和DI IOC&#xff08;Inversion of Control&#xff09;控制反转&#xff1a;对象的创建控制权由程序转移到外部&#xff0c;这种思想称为控制反转。/使用对象时&#xff0c;由主动new产生对象转换为由外部提供对象&#xff0c;此过程种对象…

[四次挥手]TCP四次挥手握手由入门到精通(知识精讲)

⬜⬜⬜ &#x1f430;&#x1f7e7;&#x1f7e8;&#x1f7e9;&#x1f7e6;&#x1f7ea;(*^▽^*)欢迎光临 &#x1f7e7;&#x1f7e8;&#x1f7e9;&#x1f7e6;&#x1f7ea;&#x1f430;⬜⬜⬜ ✏️write in front✏️ &#x1f4dd;个人主页&#xff1a;陈丹宇jmu &am…

人工智能与云计算实训室建设方案

一、 人工智能与云计算系统概述 人工智能&#xff08;Artificial Intelligence&#xff0c;简称AI&#xff09;是一种模拟人类智能的科学和工程&#xff0c;通过使用计算机系统来模拟、扩展和增强人类的智能能力。人工智能涉及多个领域&#xff0c;包括机器学习、深度学习、自然…

mysql的两张表left join 进行关联后,索引进行优化案例

一 mysql的案例 1.1 不加索引情况 1.表1没加索引 2.表2没加索引 3.查看索引 1.2 添加索引 1.表1添加索引 2.表2添加索引 3.查看

使用navicat连接postgresql报错问题解决

使用navicat连接postgresql报错问题解决 一、问题现象&#xff1a; 最近使用Navicat来连接postgreSQL数据库&#xff0c;发现连接不上&#xff0c;报错信息如下&#xff1a; 自己百度了一下&#xff0c;发现pgsql 15版本以后&#xff0c;有些系统表的列名改了&#xff0c;pg_…

一文科普,配资门户网是什么?

配资门户网是一个为投资者提供配资服务的平台。配资是指通过借用他人资金进行投资交易的一种金融操作方式。配资门户网作为一个线上平台&#xff0c;为投资者提供了方便、快捷的配资服务。 配资门户网提供了多种不同的配资方案&#xff0c;以满足不同投资者的需求。投资者可以…

录制游戏视频的软件有哪些?分享3款软件!

“有录制游戏视频的软件推荐吗&#xff1f;最近迷上了网游&#xff0c;想录制点自己高端操作的游戏画面&#xff0c;但是不知道用什么软件录屏比较好&#xff0c;就想问问大家&#xff0c;有没有好用的录制游戏视频软件。” 在游戏领域&#xff0c;玩家们喜欢通过录制游戏视频…

根据源码,模拟实现 RabbitMQ - 实现消息持久化,统一硬盘操作(3)

目录 一、实现消息持久化 1.1、消息的存储设定 1.1.1、存储方式 1.1.2、存储格式约定 1.1.3、queue_data.txt 文件内容 1.1.4、queue_stat.txt 文件内容 1.2、实现 MessageFileManager 类 1.2.1、设计目录结构和文件格式 1.2.2、实现消息的写入 1.2.3、实现消息的删除…

HCIP实验之MPLS

目录 一&#xff0c;实验题目 ​编辑 拓扑与IP地址规划如图所示 二&#xff0c;实验思路 三&#xff0c;实验步骤 3.1 私网部分IP地址配置 3.2 LSP部分配置 3.3 启动OSPF协议 3.4 启动MPLS协议 3.5 启动MPLS VPN 3.6 实现公网私网互通 3.7 配置BGP 3.8 双向重发布 …

常见的 Python 错误及其解决方案

此文整理了一些常见的 Python 错误及其解决方案。 1、SyntaxError: invalid syntax 说明&#xff1a;无效的语法是最常见的错误之一&#xff0c;通常是由于编写代码时违反了 Python 的语法规则。可能的原因&#xff1a; 忘记在 if、while、for 等语句后写冒号&#xff0c;或者…

我和 TiDB 的故事 | 远近高低各不同

作者&#xff1a; ShawnYan 原文来源&#xff1a; https://tidb.net/blog/b41a02e6 Hi, TiDB, Again! 书接上回&#xff0c; 《我和 TiDB 的故事 | 横看成岭侧成峰》 &#xff0c;一年时光如白驹过隙&#xff0c;这一年我好似在 TiDB 上投入的时间总量不是很多&#xff0…

vite打包配置以及性能优化

vite打包配置以及性能优化 安装插件 首先该安装的插件&#xff0c;你要安装一下吧 这三个是基本的插件&#xff0c;其他优化的插件下面会介绍到 "vite": "4.4.6","vite-plugin-html": "^3.2.0","vitejs/plugin-vue": &qu…

Eureka:集群环境配置

创建三个集群 导包 <!-- 导包--><dependencies><!-- Eureka -server --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-eureka-server</artifactId><version>1.…

信号

信号也是IPC中的一种&#xff0c;是和管道&#xff0c;消息队列&#xff0c;共享内存并列的概念。 本文参考&#xff1a; Linux中的信号_linux中信号_wolf鬼刀的博客-CSDN博客 Linux系统编程&#xff08;信号处理 sigacation函数和sigqueue函数 )_花落已飘的博客-CSDN博客 Linu…