【Linux】自动化构建工具-make/Makefile详解

前言

  • 大家好吖,欢迎来到 YY****滴 Linux系列 ,热烈欢迎!
  • 本章主要内容面向接触过Linux的老铁,主要内容含


欢迎订阅 YY 滴Linux专栏!更多干货持续更新!以下是传送门!

|---------------------------------------------------------------------------------------------------------------------------------|
| 订阅专栏阅读:YY的《Linux》系列 ❀❀❀❀❀ |
| 【Linux系列-P1】 Linux环境的搭建 |
| 【Linux系列-P2】Linux的基本知识与指令 |
| 【Linux系列-P3】Linux的权限 |
| 【Linux系列-P4】Linux基本工具[yum][vim] |
| |
| |
| |

目录

一.make/Makefile背景简介

二.依赖关系与依赖方法

三.makefile特性:依赖关系的自动推导

[四. make特性:根据源文件和目标文件的新旧,判定是否需要重新执行依赖关系进行编译](#四. make特性:根据源文件和目标文件的新旧,判定是否需要重新执行依赖关系进行编译)

[五. 【.PHONY】与伪目标的应用](#五. 【.PHONY】与伪目标的应用)

引入:而我们需要怎么样才能够让make每次都执行呢?

[常规应用: 【.PHONY】修饰clean,让clean对应的依赖方法每次都被执行](#常规应用: 【.PHONY】修饰clean,让clean对应的依赖方法每次都被执行)

六.特殊符号【@】【^】表示文件


一.make/Makefile背景简介

  • 会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力
  • 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的 规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂 的功能操作
  • makefile带来的好处就是------"自动化编译",一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
  • make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命 令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一 种在工程方面的编译方法。
  • make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。
  • make会自上而下扫描makefile文件,把第一个当作默认指令(例如把clean:放在开头,make的操作就是clean),所以正常情况下我们都是将要执行的程序放在开头,把clean放在下面,要用clean时,才用【make clean】调用。
  • make命令是系统默认携带的(下图中可见,make在bin目录下)
  • make会在当前目录下找对应的【依赖关系】与【依赖方法】;至于什么是依赖方法呢?详情见下文

二.依赖关系与依赖方法

引入:为了带大家更好了解依赖关系和依赖方法,YY下面给大家带来一个用例

  1. 我们先用vim创建一个makefile文件,并在当中[插入模式]中写入如图所示的依赖关系【mycode:mycode.c】与依赖方法【gcc -o mycode mycode.c】;
  2. 注意的特殊点:【clean:】其右侧没有东西,++表示clean不依赖于任何文件++;同理在【1】中,mycode依赖于mycode.c;
  3. 我们再用vim写一个mycode.c的文件
  4. 当我们回到linux界面,输入make和make clean,即可清晰见到其的依赖方法;
  • 【PS:make是默认调用makefile中第一个操作,make clean是在makefile自上而下查找】

三.makefile特性:依赖关系的自动推导

  • 由以下用例可知结论:make会++自动推导makefile中的依赖关系++ (其非常类似于递归结构,由于递归中涉及到函数栈帧的调用,我们也能明白其为栈式结构)
  • 改变先后顺序不影响;
  • 如果中途少了一组依赖关系(例如注释掉mycode.s: mycode.i)则无法运行;

四. make特性:根据源文件和目标文件的新旧,判定是否需要重新执行依赖关系进行编译

引入:当我们二次使用make指令时,会出现以下情况;这是编译器为了防止重复编译,提高效率;而这是怎么做到的呢?


结论:

  • make指令会根据源文件和目标文件的新旧,判定是否需要重新执行依赖关系进行编译
  • 在任何操作中,一定是先有源文件(.c),才有可执行程序(.exe)
  • 一般而言,可执行程序的时间一定比源文件更加新
  • 如果我们更改了源文件,此时源文件就比可执行程序要更加新,此时执行make就可以实现;反之则会出现"is up to date"的反馈

五. 【.PHONY】与伪目标的应用

引入:而我们需要怎么样才能够让make每次都执行呢?

  • 使用【.PHONY】修饰mycode,令其成为伪目标
  • 伪目标的特性是,总是被执行的;

常规应用: 【.PHONY】修饰clean,让clean对应的依赖方法每次都被执行


六.特殊符号【@】【^】表示文件

  • 用【@】表示目标文件,【^】表示冒号右侧文件
相关推荐
灯火不休ᝰ1 小时前
[win7] win7系统的下载及在虚拟机中详细安装过程(附有下载文件)
linux·运维·服务器
powerfulzyh4 小时前
Ubuntu24.04远程开机
linux·ubuntu·远程工作
ulimpid4 小时前
Command | Ubuntu 个别实用命令记录(新建用户、查看网速等)
linux·ubuntu·command
HHoao4 小时前
Ubuntu启动后第一次需要很久才能启动GTK应用问题
linux·运维·ubuntu
小灰兔的小白兔4 小时前
【Ubuntu】Ubuntu常用命令
linux·运维·ubuntu
GFCGUO4 小时前
ubuntu18.04运行OpenPCDet出现的问题
linux·python·学习·ubuntu·conda·pip
winds~4 小时前
ubuntu中软件的进程管理-结束软件运行
linux·运维·ubuntu
阳光不锈@5 小时前
麒麟桌面系统安装和配置Node.js
linux·麒麟系统安装node.js
叫我龙翔6 小时前
【Linux】进程间关系与守护进程
linux·运维·服务器·计算机网络
小诸葛的博客6 小时前
Ubuntu如何如何安装tcpdump
linux·ubuntu·tcpdump