【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对应的依赖方法每次都被执行


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

  • 用【@】表示目标文件,【^】表示冒号右侧文件
相关推荐
UpUpUp……8 分钟前
Linux--JsonCpp
linux·运维·服务器·c++·笔记·json
Willis_m24 分钟前
Linux 服务器用 SSH 拉取多个 Git 工程
linux·服务器·git·ssh
紫金修道32 分钟前
【Linux】在Arm服务器源码编译onnxruntime-gpu的whl
linux·服务器·arm开发
xq5148632 小时前
Linux系统下安装mongodb
linux·mongodb
柒七爱吃麻辣烫2 小时前
在Linux中安装JDK并且搭建Java环境
java·linux·开发语言
孤寂大仙v3 小时前
【Linux笔记】——进程信号的产生
linux·服务器·笔记
深海蜗牛3 小时前
Jenkins linux安装
linux·jenkins
愚戏师3 小时前
Linux复习笔记(三) 网络服务配置(web)
linux·运维·笔记
JANYI20184 小时前
嵌入式MCU和Linux开发哪个好?
linux·单片机·嵌入式硬件
熊大如如4 小时前
Java NIO 文件处理接口
java·linux·nio