【Linux】快速上手自动化构建工具make/makefile

👀樊梓慕:个人主页

 🎥个人专栏:《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C++》《Linux》

🌝每一个不曾起舞的日子,都是对生命的辜负


目录

前言

1.什么是make / makefile

2.如何使用make / makefile

(1)我们来看makefile如何写?

(2)如何与make搭配使用?

3.make和makefile是如何知道可执行程序是比较新的?


前言

本篇文章可以快速让你具备编写makefile的能力,并快速上手使用。


欢迎大家📂收藏📂以便未来做题时可以快速找到思路,巧妙的方法可以事半功倍。

=========================================================================

GITEE相关代码:🌟fanfei_c的仓库🌟

=========================================================================


1.什么是make / makefile

make是一条命令,makefile是一个文件,两者搭配使用就可以完成项目自动化构建(类似VS编译器(集成开发环境)的自动化编译)。

make会在当前目录下寻找名字叫"Makefile"或"makefile"的文件,并根据文件内容执行相关指令。

注:文件名必须为上面其一。


2.如何使用make / makefile

(1)我们来看makefile如何写?

首先我们用vim写一段代码,命名为mytest.c。

平时我们想要编译该.c文件如何做呢?

gcc -o mybin mytest.c

 但我们知道平时所用的比如VS编译器可不仅仅干了这一个工作,还有比如工程清理(即清理解决方案,清理目标文件的意思)等工作。

这时候就需要makefile出手了,这也是为什么叫自动化构建的原因。

在makefile中我们要按照如下格式书写语句:

mybin:mytest.c                     //依赖关系
        gcc -o mybin mytest.c  //依赖方法

mybin为目标文件,mytest.c为依赖文件,当然不一定只有这一个依赖文件。 

注:第二行缩进不可去。

我们把刚才提到的工程清理加上:

另外我们还可以利用$@代表目标文件(mybin),$^代表所有依赖文件(mytest.c) 

到这里还不够,我们要再讲一下如果mytest.c没有改变,那么make执行会重新编译生成新的目标文件mybin么?

答案是不会:如果目标文件所依赖的后面的依赖文件列表中有文件修改时间比目标文件新,那么make就会执行后面所定义的命令生成新的目标文件,否则不会。

那clean呢?

如果我们直接输入make,由于clean没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行,所以我们需要使用make clean指令。

但还有另一个问题:

如果当前目录没有clean的同名文件,那还好,不影响每次make都会执行clean。

但一旦当前目录有一个clean的同名文件,此时clean又没有依赖文件,那就麻烦大了,make clean会检测依赖文件列表中的文件有没有clean新,但是clean没有依赖文件,目标文件被认为是最新的,这就导致clean就不会被执行了。

解决方法是将目标文件clean设置为伪目标,用.PHONY修饰。

  • 伪目标的特性是:总会被执行的。

所以最终makefile中我们一般这样写:

(2)如何与make搭配使用?

保存好前面的makefile后,我们直接在命令行输入make。

make后我们再查看当前目录,会发现多出了目标文件mybin。

./mybin 执行该目标文件

 我们看该目标文件成功执行。

那我们再来试一下make clean:

我们发现make clean也可以成功执行。

=========================================================================

看到这,你已经掌握了make/makefile的基本用法

=========================================================================


3.make和makefile是如何知道可执行程序是比较新的?

对比时间,如果可执行程序.exe修改时间比所有.c文件修改时间新,说明他就是最新的。

那么我们来认识下linux下文件时间的概念:

首先利用stat命令查看某个文件的信息。

我们发现了三个时间:

  • Access  ---   访问时间(非实时更新,占用内存)
  • Modify   ---   修改时间(针对内容的修改)
  • Change ---   改变时间(针对属性的修改)

文件是由内容+属性构成。  


=========================================================================

如果你对该系列文章有兴趣的话,欢迎持续关注博主动态,博主会持续输出优质内容

🍎博主很需要大家的支持,你的支持是我创作的不竭动力🍎

🌟~ 点赞收藏+关注 ~🌟

=========================================================================

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python实现FA萤火虫优化算法优化循环神经网络回归模型(LSTM回归算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 萤火虫算法(Fire-fly algorithm,FA)由剑桥大学Yang于2009年提出 , …

Ubuntu镜像与K8S冲突,容器持续Terminating

问题 记录一次软件冲突BUG: eclipse-temurin:11-jdk(底层Ubuntu 20.04.3 LTS)镜像创建的容器在K8S-1.25.5上无法正常terminating,造成资源浪费,甚至引发K8S资源CPU insufficient报错。具体表现 某些容器镜像在K8S上无…

云轴科技ZStack信创云平台助力国泰君安期货实现信创改造

信创是数字中国建设的重要组成部分,也是数字经济发展的关键推动力量。作为云基础软件企业,云轴科技ZStack 产品矩阵全面覆盖数据中心云基础设施,ZStack信创云首批通过可信云《一云多芯IaaS平台能力要求》先进级,是其中唯一兼容四种…

分布式系统中最基础的 CAP 理论及其应用

对于开发或设计分布式系统的架构师、工程师来说,CAP 是必须要掌握的基础理论,CAP 理论可以帮助架构师对系统设计中目标进行取舍,合理地规划系统拆分的维度。下面我们先讲讲分布式系统的特点。 分布式系统的特点 随着移动互联网的快速发展&a…

【数据库】数据库并发控制的冲突检测,冲突可串行化的调度,保障事务的特性

冲突可串行化 ​专栏内容: 手写数据库toadb 本专栏主要介绍如何从零开发,开发的步骤,以及开发过程中的涉及的原理,遇到的问题等,让大家能跟上并且可以一起开发,让每个需要的人成为参与者。 本专栏会定期更新…

centos服务器安装docker和Rabbitmq

centos服务器 一 centos安装docker1 安装docker所需要的依赖包2配置yum源3查看仓库中所有的docker版本4安装docker5 设置docker为开机自启6验证docker是否安装成功 二 使用docker安装RabbitMQ拉取RabbitMQ镜像创建并运行容器 一 centos安装docker 1 安装docker所需要的依赖包 …

git解决冲突

记录一次 git 解决冲突的过程。 情况是前一段时间我基于本地的 master 分支上新建了一个分支比如叫做 weight_linear: git checkout -b weight_linear 然后我已经在这个分支上进行了修改并上传到 github 上了,比如: git add . git commit -m "u…

联软 IT 安全运维管理软件反序列化漏洞复现

0x01 产品简介 联软科技持续十多年研发的联软IT安全运维管理软件,集网络准入控制、终端安全管理、BYOD设备管理、杀毒管理、服务器安全管理、数据防泄密、反APT攻击等系统于一体,通过一个平台,统一框架,数据集中,实现更…

数据中心机房精密配电——解决方案

新一代数据中心对供电系统的可靠性及可管理性要求越来越高。IT用户需要对信息设备的供电系统进行更可靠与更灵活的配电、更精细化的管理、更准确的成本消耗等。 一、前言 随着各行业信息化的建设,数据中心机房机柜电功率的预设定问题,并且介绍了如何通…

three.js结合vue

作者:baekpcyyy🐟 1.搭建环境 ps:这里要按照node.js在之前有关vue搭建中有介绍 新建文件夹并在vsc终端中打开 1.输入vite创建指令 npm init vitelatest然后我们cd进入刚才创建的目录下 npm install安装所需依赖 npm run dev启动该项目 …

目标检测简介

文章目录 前言一、目标检测的概述1.1 目标检测概念1.2 主流解决方式1.3 应用领域 二、目标检测的发展2.1 两阶段目标检测2.2 单阶段目标检测2.3 新时代的检测技术 三、目标检测的指标3.1 基础概念3.2 评价指标3.3 评价指标代码实现3.3.1 精确率3.3.2 召回率3.3.3 准确率3.3.4 F…

[安洵杯 2019]easy_web

打开环境 img传参还有cmd img应该是base,先解码看看 3535352e706e67 这个好像是十六进制的,再解 访问一下看看,得到一张图片 尝试base解码,但是没有什么发现 再看看地址栏出现index.php,应该是要下载源码,但是还没有…

渗透测试学习day4

文章目录 靶机:SequelTask1Task2Task3Task4Task5Task6Task7Task8 靶机:CrocodileTask1Task2Task3Task4Task5Task6Task7Task8Task9Task10 靶机:ResponderTask1Task2Task3Task4Task5Task6Task7Task8Task9Task10Task11 靶机:ThreeTas…

【开源】基于Vue+SpringBoot的高校宿舍调配管理系统

项目编号: S 051 ,文末获取源码。 \color{red}{项目编号:S051,文末获取源码。} 项目编号:S051,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能需求2.1 学生端2.2 宿管2.3 老师端 三、系统…

Visual Studio 2022分析C#程序内存泄漏

背景 最近我们的项目出现了内存激增的情况,初次探讨,我们发现和机器人发生通信之后,内存会缓慢上升,直到系统崩溃。 例子 由于只是介绍一个简单的方案,所以就写一个比较简单的例子来演示了,代码如下&…

Electron+Ts+Vue+Vite桌面应用系列:TypeScript常用时间处理工具

文章目录 1️⃣ 时间处理工具1.1 格式化时间1.2 把时间戳改成日期格式1.3 Day.js 工具类使用1.4 date-fns 工具类使用 优质资源分享 作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_43151418/article/details/134712978 ElectronTsVueVite桌面应用…

C# 用代码设置受保护的Excel

写在前面 在导出Excel文件的时候,为了防止文件内容被篡改,这时候就需要对Excel设置工作簿保护和工作表保护,本文使用的是Spire.XLS的免费版本来实现,免费版本是受限的,但是一般情况下已经够用了。 通过NuGet引入Free…

怎么使用Matplotlib画图(折线图、散点图、柱状图、直方图、饼图)

文章目录 前言一、Matplotlib介绍1.1 什么是Matplotlib1.2 为什么要学习Matplotlib1.3 实现一个简单的Matplotlib画图(Hello World)1.4 认识Matplotlib图像结构1.5 拓展知识点:matplotlib三层结构1.5.1 容器层1.5.2 辅助显示层1.5.3 图像层 二…

对某登录站点的JS前端逆向思路

前言 js逆向一直没有相关了解,虽然目前渗透遇见的不是很多,大多数遇见的要么不加密,要么无法实现其加密流程,不过最近看到了一个较为简单的站点正好能够逆向出来,就做了简单记录。本文旨在介绍js逆向的一些基础思路&a…

Golang数据类型(数字型)

Go数据类型(数字型) Go中数字型数据类型大致分为整数(integer)、浮点数(floating point )和复数(Complex)三种 整数重要概念 整数在Go和Python中有较大区别,主要体现在…