Linux:自动化构建工具make/Makefile

news2024/12/23 13:54:52

文章目录

  • 一.前言
  • 二.Makefile如何写入/make命令使用
    • 2.1清楚依赖关系和依赖方法
    • 2.2删除文件
    • 2.3Makefile中的关键字.PHONY
    • 2.4一个小补充

一.前言

在此之前我们已经可以用vim编写代码和用gcc编译代码。但是如果现在要写一个大型项目,一下子写了很多源文件,在编译它时岂不是要重复使用很多次gcc命令,这样会不会太麻烦了,或者如果不小心写错命令了岂不是更要命。所以在这里我们又要接触两样新事物:make/Makefile.

make:是一个命令
Makefile/makefile:是一个文件(一般在当前源代码路径下),这里M大小写都可以

二.Makefile如何写入/make命令使用

如果要做一件事请,我们首先要清楚两样事情:依赖关系和依赖方法。比如你月底没钱花了要找妈妈要生活费,打电话过去之后,首先得喊一声妈吧,这样才能让你妈知道,电话那头是自己的孩子,这就搞清楚了依赖关系。喊完妈之后再给自己母亲说明打电话的原因,然后你妈打钱给你,这个流程就是依赖方法。这两样事情都做正确了,你才能从你妈那里要到生活费。

同样你如果需要Makefile文件和make指令帮你完成一项任务,你首先要让它知道这个任务所需要的依赖关系和依赖方法。
知道这些东西后,我们就开始用make命令来帮我们执行一次简单的任务–编译我们的.c源文件。

  1. 首先我们需要在Makefile内写一些指令:
    在这里插入图片描述

  2. 接下来退出之后用make命令
    在这里插入图片描述
    直接make一下,就自动去寻找Makefile文件,然后就生成了myfile的可执行文件。方法很简单,但是Makefile里面写的是啥还不清楚。接下来主要讲讲如何编写Makefile里面的内容。

2.1清楚依赖关系和依赖方法

编写Makefile的过程就是编写依赖关系和依赖方法的过程。我们最终要依靠myfile.c这个文件得到可执行文件myfile。所以这里的依赖关系就是:myfile这个可执行文件要依赖myfile.c形成
所以Makefile第一行就写:

//中间用:隔开
myfile:myfile.c

这行代码冒号左边的,我们称为目标文件,右边的称为依赖文件列表(右边可以有很多文件,中间用空格隔开)

随后我们要清楚依赖方法,就是如何用myfile.c文件生成myfile这个程序,所以第二行要这样写:

	gcc -o myfile myfile.c

注意第二行一定要用两个空格隔开。不要问为啥,语法规定就是要这样写。

写完之后保存退出,在用make指令执行就可以了。为了让大家更好的理解依赖关系和依赖方法这两个概念,我将代码写的更细一点

myfile:myfile.o
  gcc -o myfile myfile.o
myfile.o:myfile.s
  gcc -c -o myfile.o myfile.s
myfile.s:myfile.i
  gcc -S -o myfile.s myfile.i
myfile.i:myfile.c
  gcc -E  -o myfile.i myfile.c

make指令在执行这个文件时会先看第一行,可执行文件要依赖.o的汇编文件生成,但是此时还没有这个.o文件,所以程序会继续向下寻找,.o文件要依靠.s文件来生成,但是.s文件也同样没有,所以继续向下寻找…最后.i文件要依靠.c文件来生成。现在我们刚好有一个.c文件,所以会开始执行下面的gcc指令,从而生成了.i文件。有了.i文件,程序会一步一步回去,逐步生成.s,.o,可执行文件。这很像函数递归的样子。你也可以理解为这是数据结构里的栈:上面的依赖关系是入栈,下面的依赖方法是出栈

在这里插入图片描述

直接make命令执行,就可以得到四个文件。

2.2删除文件

依赖关系中,依赖文件列表可以没有,没有的话也同样会执行下面的依赖方法。

所以如果要写一个删除文件的代码,可以这样写:

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

既然能学到这里,我相信一个简单的删除指令就不用我多说了吧~。下面的这个rm指令就相当于依赖方法。

接下来我们就可以用make指令来执行这个程序了:
在这里插入图片描述

因为make默认会执行第一组依赖方法和依赖关系,所以这里在make后面加上需要的目标文件,也就是clean,目的就是让执行clean这一组依赖关系和依赖方法。

然后就可以发现我们这个目录下的四个文件的确被删除掉了。

2.3Makefile中的关键字.PHONY

我们刚刚已经可以用Makefile来帮助我们编译自己的程序或者删除文件。但是现在还有些缺陷,就是你用make命令只能执行一次,像这样:
在这里插入图片描述

第一次时可以正常运行,但是第二次的时候会说myfile这个文件已经是最新的了,不让你在执行命令了。我们将这种现象称为:不是总是被执行的。俗一点的说这个目标文件只能执行一次,不让你一直执行。

如果现在希望让他每次make都能运行成功的话,就再加一条命令:

.PHONY:myfile
myfile:myfile.c
  gcc -o myfile myfile.c

在这里我们如果希望myfile这个目标文件总是被执行,所以前面添加上这样一个关键字。
我们将.PHONY后面跟的文件叫做伪文件

现在发现一直重复执行make,也能成功了:
在这里插入图片描述

但是一般在编译的时候不建议这样写,一般把这个编译器放在删除命令那边,向下面这样写:

myfile:myfile.c
  gcc -o myfile myfile.c

.PHONY:clean
clean:
  rm -f myfile 

在平时可能看不出来,在一些大型项目编译的时候是很花时间的,所以不推荐将编译生成可执行程序这一块加上,PHONY这个关键字。但是删除就不一样了,你想删一次或多次都没啥影响的。(其实不加这个关键字,你一直删也没啥问题)

2.4一个小补充

刚在我们看到如果没有.PHONY这个关键词修饰的话,可执行程序只能被make命令执行一次,但是make命令是怎么知道我们这个可执行程序是最新的呢?
因为在系统中我们可以想象出有两条时间线(源代码和可执行程序):

在这里插入图片描述

首先源文件写完后的时间肯定要早于可执行程序运行的时间:
在这里插入图片描述

make指令就会判断可执行程序运行后的程序是否晚于源文件运行的时间,如果是就说明这个可执行程序是最新的。如果你修改过了这个源文件,那可执行程序的时间就要晚于源文件的时间,此时你在编译源文件,make就会帮你去完成了。

make指令,我们可以稍微“欺骗”一下。可以用touch这个指令。touch指令是:如果后面跟的那个文件不存在,就会帮你生成一个新的文件,如果后面这个文件存在,就会帮你更新这个文件的时间为最新时间。
在这里插入图片描述

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

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

相关文章

C. Zero Path(DP)

Problem - 1695C - Codeforces 给你一个有n行和m列的网格。我们用(i,j)表示第i(1≤i≤n)行和第j(1≤j≤m)列的方格,用aij表示那里的数字。所有的数字都等于1或等于-1。 你从方格(1,1)开始,每次可以向下或向右移动一个方格。最后&…

基于结点的数据结构——链表(单链表双向循环链表)| 附完整源码 | C语言版

本章内容 1.什么是链表 2.链表常见几种形式 3.无头单向非循环链表的实现 3.1结点结构的定义 3.2函数接口的实现 3.2.1尾插 3.2.2尾删 4. 带头双向循环链表的实现 4.1结点结构的定义 4.2函数接口的实现 5.两种链表的差异 ①尾插与尾删的时间复杂度 ②头插与头删的时…

Ai 作图 stable-diffusion-webui prompt

文章参考了 prompt指导手册 : https://strikingloo.github.io/stable-diffusion-vs-dalle-2 https://prompthero.com/stable-diffusion-prompt-guide 一般来说,最好的稳定扩散提示会有这样的形式: “ [主要主题]的[图片类型] &#xff0…

C语言-文件操作(13.1)

目录 思维导图: 1. 为什么使用文件 2. 什么是文件 2.1 程序文件 2.2 数据文件 2.3 文件名 3. 文件的打开和关闭 3.1 文件指针 3.2 文件的打开和关闭 4. 文件的顺序读写 4.1 对比一组函数 5. 文件的随机读写 5.1 fseek 5.2 ftell 5.3 rewind 6. 文本…

FeignClient调用源码解析

文章目录一、FeignClient二、整体流程1.使用FeignClient2.FeignClient整体调用流程三、源码解析1. 注解EnableFeignClients2. FeignClientsRegistrar3. Feign其他配置4. FactoryBean5. 方法调用一、FeignClient FeignClient作为SrpingCloud进行http请求的一个基础组件&#xf…

IP地址和MAC地址是什么?Dhcp和arp又是什么?

本期武汉海翎光电的小编和大家聊聊 计算机是如何通信的?IP地址和MAC地址是什么?Dhcp和arp又是什么?在我们的家庭网络中,有许多的网络设备,比如我们可以有两台计算机A和B, 一台手机一台电视机,他们都连接到了…

【尚硅谷】Java数据结构与算法笔记09 - 哈希表

文章目录一、哈希表引入二、基本介绍三、Google公司的一个上机题3.1 题目描述3.2 代码实现一、哈希表引入 1)看一个实际需求, google 公司的一个上机题: 2)有一个公司, 当有新的员工来报道时, 要求将该员工的信息加入(id,性别,年龄, 住址…), 当输入该员…

【Linux】理解文件系统——软硬链接

我们之前讨论的都是进程和被打开文件的关系,而如果一个文件是没有被打开呢?没有被打开的文件操作系统如何管理? 没有被打开的文件在磁盘上,所以磁盘上有大量的文件,这些文件要被静态管理起来,方便我们随时…

1588_AURIX_TC275_PMU简介

全部学习汇总: GreyZhang/g_TC275: happy hacking for TC275! (github.com) PMU是编程存储单元的缩写,但是落实到了具体的硬件模块上其实是一个Flash模块。在TC275中,只有一个PMU模块。在所有的AURIX芯片中,只有PMU0支持BootROM的…

React--》React组件的三大核心属性

目录 state 事件绑定 props 函数式组件使用props refs state state是组件对象最重要的属性,值是对象(可以包含多个 key-value的组合);组件被称为“状态机”,通过更新组件来对应页面显示(重新渲染组件),也就是有状态组件&…

ASP.NET Core 3.1系列(29)——System.Text.Json实现JSON的序列化和反序列化

1、前言 在Web开发中,JSON数据可以说是无处不在。由于具有轻量、易读等优点,JSON已经成为当前主流的数据传输格式。在ASP.NET Core 3.0之前,大多数项目都会使用Newtonsoft.Json组件来实现JSON的序列化和反序列化操作,而从ASP.NET…

《王道》操作系统整理

操作系统第1章 OS概述第1节 OS基本概念第2节 OS发展与分类第3节 OS运行机制和体系结构1.3.1 操作系统的运行机制1. 时钟管理2. 中断机制3. 原语4. 系统资源管理或系统控制的数据结构及处理1.3.2 中断和异常1.3.3 系统调用第2章 进程管理第3章 内存管理第4章 文件管理第5章 IO管…

【8】SCI易中期刊推荐——计算机 | 人工智能(中科院4区)

🚀🚀🚀NEW!!!SCI易中期刊推荐栏目来啦 ~ 📚🍀 SCI即《科学引文索引》(Science Citation Index, SCI),是1961年由美国科学信息研究所(Institute for Scientific Information, ISI)创办的文献检索工具,创始人是美国著名情报专家尤金加菲尔德(Eugene Garfield…

【SpringCloud11】Hystrix断路器

Hystrix断路器1.概述1.1分布式系统面临的问题1.2Hystrix 是什么1.3Hystrix 的作用1.4官网资料1.5Hystrix官宣停更进维2.Hystrix重要概念2.1服务降级(fallback)2.2服务熔断(break)2.3服务限流(flowlimit)3.H…

手把手教你使用Python实现推箱子小游戏(附完整源码)

文章目录项目介绍项目规则项目接口文档项目实现过程前置方法编写move核心方法编写项目收尾项目完善项目整体源码项目缺陷分析项目收获与反思项目介绍 我们这个项目是一个基于Python实现的推箱子小游戏,名叫Sokoban: 这个游戏的目的是让玩家&#xff0…

jfow-代码分析

jfow-代码分析目录概述需求:设计思路实现思路分析1.代码:2.代码2:3.CashFrmTemplate4.chartType5.DataColumnData:参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xf…

Vue实战第1章:学习和使用vue-router

学习和使用vue-router 前言 本篇在讲什么 简单讲解关于vue-router的使用 仅介绍简单的应用,仅供参考 本篇适合什么 适合初学Vue的小白 适合想要自己搭建网站的新手 适合没有接触过vue-router的前端程序 本篇需要什么 对Html和css语法有简单认知 对Vue有…

2023/1/14 js基础学习

1 js基础学习-基本数据类型基本语法 请参考 https://blog.csdn.net/m0_48964052?typeblog https://gitee.com/hongjilin/hongs-study-notes/blob/master/%E7%BC%96%E7%A8%8B_%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/HTMLCSSJS%E5%9F%BA%E…

Arthas 入门到实战(二)在线热更新

1. 结合 jad/mc 命令在线修改使用 jad 命令: 将 JVM 中实际运行的 class 的 byte code 反编译成 java 代码,便于你理解业务逻辑; mc命令:Memory Compiler/内存编译器,编译.java文件生成.class。 redefine命令:加载…

unix进程控制及进程环境--自APUE

文章目录概述1、孤儿进程和僵尸进程进程终止进程的编译和启动进程终止的步骤进程8种终止方式进程退出函数1:exit进程退出函数2:_exit进程退出函数3:_Exit注册终止处理程序:atexit环境变量通过main函数传参全局的环境变量表&#x…