Linux——makefile自动化构建工具

news/2025/2/19 15:02:02/

       一. 前言

        一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的 规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂 的功能操作 makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编 译,极大的提高了软件开发的效率。

        make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命 令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一 种在工程方面的编译方法。 make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。

        二. 创建makefile工具:

对比不使用makefile工具时和使用makefile工具的差别:

不使用makefile工具时:

        步骤1: 创建一个.c文件:

        步骤2:对.c文件进行代码编写:

 

         步骤3:将.c文件编译为可执行文件

        步骤4: 输出可执行文件的结果:

                指令:./可执行文件名

        步骤5: 发现.c文件中有bug,修改文件代码

 

         步骤6:重新编译.c文件生成可执行文件 myset.exe :

 一般来说,常规情况下编译.c文件然后形成可执行文件的步骤就是来来回回这么6步。


若是有了makefile工具后,使得这些繁琐的步骤指令更加简单化:

        步骤1:

       makefile是一个文件名,若想构建自动化工具,只能touch这个文件名,起其他的名字,操作系统不会认为这是自动化构建工具。 

         步骤2:编写自动化工具指令,采用vim编辑器进行:

 makefile中需要注意两个关键: 1.依赖关系,2.依赖方法

这两点是makefile存在的意义


举个例子,某个大学生到了月底,生活费就花的差不多了,这时他就得问父母要生活费了,于是给老爸打电话说:“爸,我没钱花了。
依赖关系就是: 我是你儿子 (亲子关系) ;依赖方法: 电话告父亲没钱花了 !
若是向舍友父亲借钱: 这个依赖关系不成立,毕竟人家和你没有任何关系!

        步骤3:

        根据上图,儿子就相当于是可执行目标程序,根据逻辑可执行得依赖.c文件才能生成。其次依赖的方法就是.c文件形成可执行的具体指令。 

所以makefile工具设置指令分为两行,第一行设置文件生成的依赖关系,第二行设置依赖方法。

重点:在第二行设置时,需要先按一下Table键,空出几格,才可以设置依赖方法!!!!

千万不要用按空格键空出几格,空格键空出的几格与Table键空出的意义完全不同。

保存退出后,使用makefile写好的指令: 

如何使用在makefile中写好的指令?

在输入每条设置好的指令之前,都需要先输入make,再输入指令。这是makefile工具的特性。

        注:原本设置好的指令是:myset.exe,应该输入make myset.exe才对,但是只输入make,它会默认执行makefile工具的第一条指令,所以就后面的myset.exe就可以直接省略。

        根据该指令是否处于makefile的首行指令就可以判断,是否使用make 还是使用make+指令A去执行。

测试可执行文件是否能够显示成功的结果: 

        那么根据该试验可得:提前设置好指令便可以简单化,提高效率,使得简单的make指令就能代替复杂的gcc myset.c -o myset.exe指令。此外makefile还可以设置多个指令。


这里介绍一下makefile工具的语法:.PHONY

        该语法被称作是伪目标,含义:被设置好的指令A若是加上了.PHONY语法,那么该指令A总是会被执行 (不论什么阻碍,总是要执行的)。

        这句话有些不好理解,我们通过试验来理解,如下图:.PHONY:clean ,设置clean,它是用来删除可执行文件的指令

结果测试:

注:设置好的指令,使用时前面都需要加make 。 

 

        如上图本来myset.exe已经被删除了(ll指令查看当前目录下并没有myset.exe文件),再一次执行make clean指令后,系统仍会再次执行rm -f删除该文件,这就是无论什么阻碍,makefile工具总会执行一一即使没有该.exe文件,系统仍是无条件的执行! 

.PHONY用在clean指令上还是不太能真正理解,我们试试用在myset.exe指令上试试:

 现在已经有了myset.exe了,再执行make指令,系统就会提示myset.exe已经编译完成,无需再次编译。(上图的情况是myset.exe指令还未加.PHONY语法时的情况)

将myset.exe指令加上PHONY语法:

 结果测试:


多层依赖关系:

例1: 

指令解析:

      make后,默认执行makefile第一条指令,想要生成.exe文件就得依赖.o文件,但现在.o文件不存在,继续往下依赖,.o文件的生成依赖于.s文件,但.s文件也不存在,往下依赖,想要生成.s文件,它依赖于.i文件,但.i文件也不存在,继续往下依赖,想要生成.i文件,依赖于.c文件,现在有.C文件,那么就可以生成.i文件,便可以倒推回去,一步一步的生成.i,.s,.o文件,之后.exe文件便可以生成了! 这就好比是栈,先进的后出,先执行的没办法生成,最后进来的可以先生成。

 

试验结果: 

 


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

相关文章

leecode 数据库:608. 树节点

导入数据: Create table If Not Exists Tree (id int, p_id int); Truncate table Tree; insert into Tree (id, p_id) values (1, None); insert into Tree (id, p_id) values (2, 1); insert into Tree (id, p_id) values (3, 1); insert into Tree (id, p_id) v…

基于html+css的图展示89

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

【音视频】音视频自研对比

WVP(自研视频调度平台)CM8播放器(前端)传输协议:websocket 编码协议:ts 语言:TS传输协议:websocket 编码协议:fmp4、mse 语言:JS框架:jessibuca 性质&#xf…

【开源项目】权限框架Nepxion Permission原理解析

项目介绍 Nepxion Permission是一款基于Spring Cloud的微服务API权限框架,并通过Redis分布式缓存进行权限缓存。它采用Nepxion Matrix AOP框架进行切面实现,支持注解调用方式,也支持Rest调用方式 项目地址 https://toscode.gitee.com/nepxion…

Web安全常见攻击

前言 本篇主要简单介绍在 Web 领域几种常见的攻击手段。 1. Cross Site Script(XSS跨站脚本攻击) 首先插播一句,为毛叫 XSS,缩写明显是 CSS 啊?没错,为了防止与我们熟悉的 CSS(Cascading Style Sheets&am…

vue+element纯手工完美模拟实现小米有品网站

一、预览 小米有品官网:小米有品 本作品demo预览地址:点击预览 二、效果图对比 1.官方效果截图: 2.作者实现的demo效果图: 首页: 上新精选: 商品详情: 购物车: 登录: …

Linux——IO之系统接口+文件描述符详解

IO 文件再次理解系统接口文件操作理解文件描述符 fd 文件再次理解 文件 文件内容 文件属性 其中文件属性也是数据–>即便你创建一个空文件,其也是要占据磁盘攻坚的。 文件操作 文件内容的操作 文件属性的操作 有可能在操作文件的过程中即改变文件的内容&…

【华为OD机试真题2023B卷 JAVA】阿里巴巴找黄金宝箱(II)

华为OD2023(B卷)机试题库全覆盖,刷题指南点这里 阿里巴巴找黄金宝箱(II) 知识点数组哈希表优先级队列 时间限制:1s 空间限制:256MB 限定语言:不限 题目描述: 一贫如洗的樵夫阿里巴巴在去砍柴的路上,无意中发现了强盗集团的藏宝地,藏宝地有编号从0~N的箱子,每个箱子上…