【Linux】make/Makefile的简单使用

news2025/1/19 22:13:57

人生的态度是,抱最大的希望,尽最大的努力,做最坏的打算。 – 柏拉图 《理想国》
在这里插入图片描述

目录

  • 一.Linux项目自动化构建工具-make/Makefile
    • 1.为什么需要使用make/Makefile
    • 2.简单理解make和Makefile
    • 3.如何编写Makefile文件
      • 3.1生成可执行程序:
      • 3.2清理:
        • 这里我们为什么使用的是make clean而不是make呢?
      • 3.3.PHONY关键字
        • 如何判断文件是否需要重新执行?
    • 4.总结:

一.Linux项目自动化构建工具-make/Makefile

1.为什么需要使用make/Makefile

  • 上文中,我们编译hello.c,需要使用gcc hello.c -o hello来生成可执行程序hello,每次我们要生成可执行程序,都要gcc一下,不免有些繁琐。
  • 如果感觉上面麻烦一下也还可以接受,那如果我们的程序包含很多个源文件时,该咋整?用gcc命令逐个去编译时,就发现很容易混乱而且工作量大。因此我们要学会使用make/makefile。有效的利用make和makefile工具不仅可以大大提高项目开发的效率。而且会不会写makefile,从侧面说明了一个人是否具备完成大型工程的能力

2.简单理解make和Makefile

  • make是一个命令工具,是一个解释makefile中指令的命令工具,通过调用makefile文件中用户指定的命令来进行编译和链接的。
  • makefile是一个文件(当前源代码路径下),makefile文件中包含了调用gcc(也可以是别的编译器)去编译某个源文件的命令。

3.如何编写Makefile文件

makefile是一个围绕依赖关系和依赖方法构成的一个自动化编译工具
我们介绍一下依赖关系和依赖方法:

  • 依赖关系
    例如我们要生成可执行程序hello,他是依赖于我们的hello.c的,所以他们的依赖关系为hello:hello.c.
  • 依赖方法
    在依赖关系的下一行(tab键开头),写下两者关系实现的方法,gcc hello.c -o hello就是我们hello:hello.c这组依赖关系的依赖方法。

3.1生成可执行程序:

我们写下下面的内容:

在这里插入图片描述
我们输入make,发现他很快就执行了gcc hello.c -o hello命令,生成了hello的可执行程序

在这里插入图片描述

3.2清理:

既然可以执行gcc hello.c -o hello命令来生成可执行程序,当然也可以执行rm等你想要执行的命令。
对于依赖关系也有特殊,目标文件对应的依赖文件列表可以是空

  • 目标文件:就是依赖关系中:左边的文件
    • 例如:hello:hello.c,hello就是我们的目标文件
  • 依赖文件列表:就是依赖关系中:右边的文件
    • 例如,hello:hello.c,hello.c就是我们的依赖文件列表,为什么叫列表,就是因为一个目标文件可以依赖多个文件,即:右侧可以有多个文件。

我们就可以这样编写:
在这里插入图片描述
输入make clean就能执行rm hello命令了。
在这里插入图片描述

这里我们为什么使用的是make clean而不是make呢?

  • 因为单独使用make,从上到下扫描,默认只会执行第一组依赖关系

证明:

我们将clean写在最前面
在这里插入图片描述
我们执行clean默认执行了rm hello
在这里插入图片描述
如要执行gcc命令,还要用make hello
在这里插入图片描述

3.3.PHONY关键字

  • PHONY:总是被执行的!

什么意思呢?
当hello可执行程序已经存在时且是最新的,不需要再次进行编译,make就无法被执行
在这里插入图片描述
这种现象叫做不总是被执行的!

当我们想每次都可以执行成功时,我们就可以使用.PHONY关键字
.PHONY:目标文件

在这里插入图片描述

  • 这样我们每次make都能成功
    在这里插入图片描述
    不过.PHONY对我们的源文件,没有什么意义
    .PHONY一般都是来修饰我们的clean

如何判断文件是否需要重新执行?

当可执行程序已经是最新的时候,make就无法被执行,可他是如何判断的呢?

  • 判断源代码和可执行程序的最近修改时间
    • 当我们的源代码的时间早于可执行程序时,此时就没必要再次执行生成可执行程序,make也就不会被执行
    • 当我们的源代码时间晚于可执行程序时,说明代码有改动,但最新的可执行程序还没有生成,所以make就可以被执行。

我们可以通过stat命令可以显示文件的状态信息

Modify代表文件内容被修改的时间,Change代表文件属性被修改的时间,Access代表最后一次访问文件的时间

在这里插入图片描述
源代码的最近修改时间早于可执行程序,make也就无法执行.

4.总结:

  • make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。
    make是一个命令工具,是一个解释makefile中指令的命令工具
    makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
  • makefile的一些简单使用
    • 生成可执行程序
    • 清理
    • .PHONY关键字的使用
  • 以及两个小问题
    • 如何判断文件是否需要重新执行?
    • 为什么使用的是make clean而不是make?

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

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

相关文章

智算中心掀落地热潮,加速AI普惠化

11日,国家信息中心与浪潮信息联合发布的《智能计算中心创新发展指南》显示,目前全国有超过30个城市正在建设或提出建设智算中心,“十四五”期间,对智算中心的投资可带动人工智能核心产业增长约2.9-3.4倍。 《科创板日报》记者注意…

python+人脸识别+opencv实现真实人脸驱动的阿凡达(中)

目录一、前言二、消除图片拼接缝隙三、基于一张图片正脸转侧脸的实现1、人体头部的二维成像知识2、用特征点驱动的方法实现侧脸2.1python核心代码三、后续工作一、前言 我们在上篇名叫python人脸识别opencv实现真实人脸驱动的阿凡达(上博文里已经实现了基于三角映射…

教资报名啦 有问题欢迎评论区提问~

报考小tips: ①一次选报你所有准备报考的学科 ②看好类别,有些是“音体美专业”专属 ③审核前如果发现有漏报的科目,可以先取消再报 ④一旦审核通过,就不能更改/增加/较少报考科目 ⑤缴费成功后,不退费【如果考试前几天…

德云社、本山传媒齐聚辽宁卫视春晚,郭德纲和本山大叔会参加吗

腊月二十九,屋里走。不得不说辽宁卫视会选时间,兔年的春晚定在了农历腊月二十九这一天。备受关注的辽宁卫视春晚,准备在农历的腊月二十九晚上七点三十分,正式与广大观众见面。 辽宁卫视春晚之所以倍受期待,是因为这些年…

【MySQL】深入理解MySQL事务(上篇)

MySQL事务前言事务的ACID 特性事务提交方式事务常见操作方式正常演示 - 证明事务的开始与回滚非正常演示1 - 证明未commit,客户端崩溃,MySQL自动会回滚(隔离级别设置为读未提交)非正常演示2 - 证明commit了,客户端崩溃…

2021年大数据挑战赛A题智能运维中的异常检测与趋势预测求解全过程论文及程序

2021年大数据挑战赛 A题 智能运维中的异常检测与趋势预测 原题再现: 异常检测(异常诊断/发现)、异常预测、趋势预测,是智能运维中首当其冲需要解决的问题。这类问题是通过业务、系统、产品直接关联的 KPI 业务指标进行分析诊断&…

【Linux】生产者消费者

生产者消费者 生产者消费者问题概述 生产者/消费者问题,也被称作有限缓冲问题。可以描述为:两个或者更多的线程共享同一个缓冲 区,其中一个或多个线程作为“生产者”会不断地向缓冲区中添加数据,另一个或者多个线程作为“消费者”…

优先级队列--堆的应用(堆排序与TopK问题)

堆排序:比较方式为小于建大堆 priority_queue(Iterator first, Iterator last): _con(first, last) // 1、使用vector的区间构造函数来初始化_con{// 2、建堆:从完全二叉树的最后一个非叶子结点来进行向下调整for (int i (size() - 2) / 2; i > 0; i…

2023真无线蓝牙耳机怎么选?值得入手的蓝牙耳机推荐

蓝牙耳机作为近几年备受人们欢迎的数码产品,很多人都想买到一款适合自己的蓝牙耳机。但,随着蓝牙耳机的快速发展,蓝牙耳机市场充斥着各种机型,它们有着不同的性能、价格、外观等。所以,不少人都有一个疑惑,…

玩转 MySQL Shell 沙盒实例

什么是沙盒实例? 沙盒实例仅适用于出于测试目的在本地计算机上部署和运行,可以与 InnoDB Cluster 、 InnoDB ClusterSet 和 InnoDB ReplicaSet 一起工作。 如何使用部署沙盒的 API 函数? 语法dba.deploySandboxInstance(port[, options])解…

Mybatis学习笔记(一)

什么是框架? 它是我们软件开发中的一套解决方案,不同的框架解决的是不同的问题使用框架的好处:框架封装了很多的细节,使开发者可以使用极简的方式实现功能,大大提高开发效率 三层架构 表现层:用于展示数…

慕尼黑工业大学开源含四季的数据集:用于自动驾驶的视觉长期定位

以下内容来自[从零开始机器人SLAM知识星球] 每日更新内容 点击领取学习资料 → 机器人SLAM学习资料大礼包 #论文# #开源数据集# 4Seasons: Benchmarking Visual SLAM and Long-Term Localization for Autonomous Driving in Challenging Conditions 地址:https:/…

LeetCode[295]数据流的中位数

难度:困难题目:中位数是有序整数列表中的中间值。如果列表的大小是偶数,则没有中间值,中位数是两个中间值的平均值。例如 arr [2,3,4] 的中位数是 3 。例如 arr [2,3] 的中位数是 (2 3) / 2 2.5 。描述:实现 MedianFinder 类:…

工信部及多地政府联合阿里健康在全国展开防疫保供专项行动

为了切实服务好百姓的购药需求,在工信部和各地政府的指导下,12月疫情政策调整以来,阿里健康已先后在全国20多个省市及地区配合药品物资精准投放工作,为各地居民重点供退热药、N95口罩等紧缺药品和物资,尽全力打好药品保…

Android系统定制开发过程快速查找定位分析代码的方法

推荐阅读 ​Android系统开发过程快速查找定位代码的方法 Android10以上系统定制Root权限(隐藏Root权限) 商务合作 2023年招聘 2023年逆向分析资料汇总 Android系统开发过程,经常需要进行文件查找、代码查找,常用find和grep查找命令 1.find命令 根据文…

短短六年时间冲到二奢品类第一,妃鱼如何做到的?

随着消费需求不断增长,二手奢侈品市场近五年来快速向规模化、平台化发展,妃鱼、红布林、胖虎等二奢电商品牌迅速崛起,成为风头劲胜的网红。国泰君安研究报告显示,中国闲置高端消费品零售市场规模已从2016年162亿元增长至2020年的5…

Vue js混淆加密 webpack-obfuscator

公司要求加密混淆js 之前 是用的glifyjs-webpack-plugin ,感觉不行。 然后使用了webpack-obfuscator 非常nice~,除了打包出来体积会有点大,浏览的网页会变慢,选择最低是就还好, 有多个条件属性可以选择, 可以选择高度混…

networkx学习(三) 随机网络

networkx学习(三) 随机网络 1.规则网络 2.随机网络的生成算法 第一种:G(N,L) import random import itertoolsdef GNL(N, L):G = nx.Graph()G.

硬盘数据如何恢复?电脑硬盘资料恢复,方法就是这么简单!

硬盘作为重要的存储设备,里面保存的数据是很重要的。日常生活和工作中,硬盘发生数据丢失也是很常见的事情,比如:误删重要文件并清空了回收站、文件打不开提示格式化、分区变成RAW格式、电脑重新分区等。各种数据丢失原因数不胜数。…

卷积神经网络-cnn和lstm

文章目录1. 卷积神经网络1.1 卷积神经网络的基础1.2 卷积神经网络和传统的网络的区别1.3 卷积的作用1.3.1 图像颜色通道1.3.2 卷积的次数1.4 卷积层涉及的参数1.4.1 滑动窗口的步长1.4.2 卷积核的大小1.4.3 边缘填充1.4.4 卷积核的个数1.4.5 卷积参数共享1.5 池化层1.6 整体网络…