码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【Linux】自动化构建工具-make/Makefile详解


    1175ee7859cc48aea62cd5d09ac60a8a.png

     前言

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

    bd9b7e30a16a43ea9ccc7a148e4d3d9b.png

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

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

    目录

    一.make/Makefile背景简介

    二.依赖关系与依赖方法

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

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

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

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

    常规应用: 【.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目录下)

    817881de87c846e99bfe5f14ebfddcbf.png

    •  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自上而下查找】

    a931296d9888482a8650d21f372f8457.png


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

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

    11f42b1d03fe411fbad8924a0af7aed4.png


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

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

    90d730f9ef1b4835aa9857c0aedfc4c3.png

    结论:

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

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

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

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

    9b1bc17b17a34b28960eaa8052aa1c8b.png

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

    4f0a2990cbe5466491ee48303a811f05.jpeg


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

    • 用【$@】表示目标文件,【$^】表示冒号右侧文件

    06f8496c025b4af790403098fcd30803.png

    我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=3ka778egd7swo

  • 相关阅读:
    要让程序员在代码中添加注释
    分布式 ID
    正则表达式相关概念及不可见高度页面的获取
    react创建项目后运行npm run eject无法暴露配置文件(已解决!!!)
    新一代分布式实时流处理引擎Flink入门实战之先导理论篇-上
    Java.lang.Class desiredAssertionStatus()方法有什么功能呢?
    SwiftUI使用MatchedGeometryEffect快速同步不同继承层级中视图的位置和尺寸
    深度学习-消融实验
    互联网Java工程师面试题·Java 总结篇·第一弹
    cv2.fillPoly的大坑
  • 原文地址:https://blog.csdn.net/YYDsis/article/details/131515237
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号