【Linux】项目自动化构建工具make/makefile

图片名称
🎉博主首页: 有趣的中国人

🎉专栏首页: Linux

🎉其它专栏: C++初阶 | C++进阶 | 初阶数据结构

在这里插入图片描述

小伙伴们大家好,本片文章将会讲解Linux项目自动化构建工具make/makefile的相关内容。


如果看到最后您觉得这篇文章写得不错,有所收获,麻烦点赞👍、收藏🌟、留下评论📝。您的支持是我最大的动力,让我们一起努力,共同成长!

文章目录

  • 1. 何为make/makefile
  • 2. make/makefile的原理
  • 3. makefile中的变量以及自动显示问题
  • 4. makefile 目标文件的生成顺序



1. 何为make/makefile


当谈到在Linux中进行项目构建时,makemakefile是两个非常重要的工具。它们提供了一种自动化构建的方法,使得开发者能够轻松地编译和构建复杂的软件项目。下面我会分别介绍一下makemakefile


⏳ make 简介⌛

make 是一个命令行工具(指令),用于自动化构建程序或项目。它通过读取一个称为 makefile 的文件来确定构建项目所需的步骤。make工具的核心理念是根据文件之间的依赖关系以及每个文件的修改时间,决定哪些文件需要重新编译,从而实现高效的构建。


⏳ makefile 简介⌛

makefile 是一个文本文件,其中包含了一系列规则和命令,用于指导 make 工具如何构建项目。makefile 定义了项目中的各种组件(例如源文件、目标文件和依赖关系),以及如何将它们组合在一起以生成最终的可执行文件或库文件。



2. make/makefile的原理


⏳ 我们先来看一个例子:⌛

  1. 首先新建一个名为code.c的文件,并写入一段简单的代码:
# 新建名为code.c的文件 [dsj@alicloud-dsj lesson11]$ touch code.c  

# code.c中所输入的代码

#include <stdio.h> int main()
 { 	 
 	int i = 0; 	 
 	for (i = 0;i < 10; ++i) 	 
 	{
	   	printf("%d\n",i); 	
 	} 	 
	return 0; 
 } 
  1. 新建一个名为makefile或者Makefile的文件,并在其中输入以下代码:

在这里插入图片描述

code.exe:code.c 	
	gcc -o code.exe code.c

.PHONY: clean 
	clean: 	rm -f code.exe 

  1. 退出,并依次输入makemake clean指令:

输入make指令:

在这里插入图片描述

[dsj@alicloud-dsj lesson11]$ ll total 20
-rw-rw-r-- 1 dsj dsj  116 May  9 21:33 code.c
-rwxrwxr-x 1 dsj dsj 8360 May  9 21:38 code.exe
-rw-rw-r-- 1 dsj dsj   79 May  9 21:36 makefile 

输入make clean指令:
在这里插入图片描述

⏳ 原理解释⌛

看完之后我们可能对make/makefile有以下几点疑问:

1. makefile文件中的代码是什么意思;

2. 为什么输入make就能生成code.exe的文件,而不是 make code.exe


接下来我来一一解释这几个问题:


问题1:makefile文件中的代码是什么意思:

在这里插入图片描述
在这里插入图片描述

我们把code.exe 称为目标文件code.c称为依赖关系,下面的指令gcc -o code.exe code.c称为依赖方法

目标文件(targets)指定要构建的文件或操作的名称。这可以是可执行文件、目标文件、清理操作等。

依赖关系(Dependencies )指定每个目标所依赖的文件或操作。如果某个目标的依赖文件发生了变化,那么该目标就需要重新构建。有时,依赖关系可以省略依赖关系也可以有多个

依赖方法(Commands)指定 make 工具执行的操作步骤。这些操作通常是编译源代码、链接目标文件、复制文件等有时可以有多个依赖方法


这个搞明白了,那clean这个目标文件前面一行的.PHONY又是什么意思呢?


在这里插入图片描述


我们先了解一个概念:makefile中的操作默认是只执行一次的,因为这样可以提高编译的效率

.PHONY.PHONY 是告诉 make 工具,该目标不是实际的文件,而是一个动作或操作,并且这个操作总是要被执行的。

总是要执行的意思就是只要你输入了指令make clean这个指令那么对应的操作方法就要被执行。


那么问题又来了,只执行一次是怎么做到的呢?


  1. 首先我们可以用命令 stat [filename] 来查看一个文件的修改时间
  2. 其次,对于每个要生成的目标文件要依赖于依赖关系,而我们也可以查看这些依赖关系中的文件的修改时间,也可以查看目标文件的修改时间
  3. 如果 目标文件修改时间 先于 依赖文件的修改时间,说明依赖文件在编译后进行了修改,那么执行make指令,重新生成一个目标文件
  4. 反之,如果 目标文件修改时间 晚于 依赖文件的修改时间,说明依赖文件并没有进行修改,那么执行make指令 不会 重新生成一个目标文件

那我们来验证一下,看一下下面的例子吧:

目标文件 修改时间 晚于 依赖文件 修改时间的例子:

在这里插入图片描述

目标文件 修改时间 早于 依赖文件 修改时间的例子:

在这里插入图片描述


问题2: 为什么输入make就能生成code.exe的文件,而不是make code.exe


因为make指令会默认生成 makefile 中的第一个目标文件。但是输入make code.exe也是可以的。

在这里插入图片描述



3. makefile中的变量以及自动显示问题


makefile中我们可以用$@来代替目标文件$^来代替依赖关系文件,例如:

在这里插入图片描述

也是可以编译通过的😁!
在这里插入图片描述

makefile中也是可以出现变量的,但是这里的变量和其他编程语言有些不同,先看个例子吧:

注意定义变量的时候不能出现空格,除非依赖多个文件!
在这里插入图片描述
也是可以编译通过的😁!
在这里插入图片描述

我们发现在每次输入make指令的时候都会打印出他所执行的指令,例如:


在这里插入图片描述


我们可以修改相关的`makefile`代码,只需要在每个依赖方法之前加上`@`符号即可,使得它不出现:

不加@符号:

在这里插入图片描述


make一下会发现他把他所执行的指令和我们要让他打印的东西一起打印了:
在这里插入图片描述
@符号:

在这里插入图片描述

make一下会发现他并没有把他所需要执行的指令打印出来,只打印了我们让他打印的东西:
在这里插入图片描述



4. makefile 目标文件的生成顺序


看一下这个makefile文件:

在这里插入图片描述

源码:

code.exe: code.s
	gcc -o $@ $^
code.o: code.s
	gcc -o $@ -c $^
code.s: code.i
	gcc -o $@ -S $^
code.i: code.c
	gcc -o $@ -E $^

.PHONY:clean
clean:
	rm -f code.i code.s code.o code.exe


如果我们直接make,由于找不到依赖文件code.s,但是此时不会停止执行,会继续向下寻找,但是向下找到了code.o文件,但是它的依赖文件是code.s文件,因为此时没有code.c文件,会继续向下寻找……
可以发现,这类似于递归的一个过程,没找到就会继续递归,直到找到为止。
当然如果最后还是找不到需要的依赖文件就会报错。

报错示例:

在这里插入图片描述

在这里插入图片描述

🤔当然,由于make指令默认生成的是第一个目标文件,所以指挥生成和第一个目标文件相关的内容,我们可以改一下顺序来验证一下,咱们将.o放在第一个:


在这里插入图片描述

在这里插入图片描述

🤔那如果咱们再改一下顺序,把.o需要的.s文件不放在直接顺序上的下一个会怎么样呢?


在这里插入图片描述

🤔可以发现还是可以的,不会报错。


在这里插入图片描述


🐼所以说,只要makefile文件中给出了所需要的依赖文件,make都能帮你找到,不会报错🎋

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

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

相关文章

[windows系统安装/重装系统][step-2]BIOS设置UEFI引导、磁盘分区GPT分区、安装系统[含完整操作拍照图片]

背景 先准备U盘启动盘和系统镜像: [windows系统安装/重装系统][step-1]U盘启动盘制作&#xff0c;微软官方纯净系统镜像下载 前言&#xff08;略长&#xff0c;建议可跳过&#xff09; 我的笔记本升级了CPU升级了内存后出现了一个小问题&#xff0c; 每次启动徽标显示后会…

hyper-v启动centos7虚拟机不能联网

虚拟网卡要和之前虚拟机里面设置的GATEWAY一致。 安装CentOS遇到Error setting up base repository换url 或者换镜像包iso(这个有用&#xff09; 没掌握摸Yu的精髓 好累啊

安全加固

目录 1.文件锁定管理 2.设置用户账户有效期 3.查看并清除命令历史记录 4.设置用户超时登出时间 5.用户切换 6.用户提权 7.禁用重启热键CtrlAltDel 8.设置单用户模式密码 9.调整BIOS引导设置 10.禁止root用户从本地登录&#xff1a; 11.禁止root用户通过ss…

【算法刨析】完全背包

完全背包与01背包的区别 01背包对于一个物品只能选择一次&#xff0c;但是完全背包可以选择任意次&#xff1b; 思路 和01背包类似&#xff0c;01背包我们只需要判断选或不选&#xff0c;完全背包也是如此&#xff0c;不同的是&#xff0c;对于这个物品我们在判断选后在增加一…

【考试100】2023年监理《目标控制(土建)》真题及答案精选

​来源&#xff1a;考试100 一、单项选择题 1、工程建设与使用中&#xff0c;保证人身和环境免受危害&#xff0c;是建设工程质量特性中的&#xff08; &#xff09;要求。A .适用性 B .耐久性 C .安全性 D .可靠性 参考答案&#xff1a;C 解析&#xff1a;安全性&…

2024 全自动ai生成视频MoneyPrinterTurbo源码

只需提供一个视频 主题 或 关键词 &#xff0c;就可以全自动生成视频文案、视频素材、视频字幕、视频背景音乐&#xff0c;然后合成一个高清的短视频。 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/89208288 更多资源下载&#xff1a;关注我。

AGV与智能仓储系统集成的实践与优化

agv 根据相关研究报告指出&#xff0c;储存、装卸、等待及运送等程序&#xff0c;几乎占了整个生产制程95%的时间&#xff0c;因此导致工厂中的再制品及物料无法有效降低&#xff0c;耗损大量人工等问题&#xff0c;早已是制造业者在经营上的痛点。而智慧工厂中的AGV无人搬运车…

Gitee 码云与Git 交互

优质博文&#xff1a;IT-BLOG-CN 一、进入码云官方网站&#xff0c;注册用户 码云(Gitee.com)是一个类似于GitHub的在线代码托管平台。 码云提供了包括版本控制、代码托管、协作开发和代码分享等功能&#xff0c;基于Git开发&#xff0c;支持代码在线查看、历史版本查看、Fo…

《系统架构设计师教程(第2版)》第10章-软件架构的演化和维护-06-大型网站系统架构演化实例

文章目录 第一阶段&#xff1a;单体架构第二阶段&#xff1a;垂直架构第三阶段&#xff1a;使用缓存改善网站性能第四阶段&#xff1a;使用服务集群改善网站并发处理能力第五阶段&#xff1a;数据库读写分离第六阶段&#xff1a;使用反向代理和CDN加速网站响应第七阶段&#xf…

CommandLineRunner和ApplicationRunner接口实现类中run方法发生异常导致spring程序关闭

今天其他组的一个程序在k8s中启动报错&#xff0c;启动之后立马就关闭了。我去看日志&#xff0c;发现最后面报了一个UnknownHostException异常&#xff0c;感觉是这个原因导致的&#xff0c;然后查看异常栈。定位到一个CommandLineRunner接口实现类&#xff0c;这个实现类里面…

乡村振兴的文化旅游融合:整合乡村文化资源与旅游资源,发展文化旅游产业,提升美丽乡村的文化内涵和旅游吸引力

一、引言 随着城市化进程的加速和人们精神文化需求的日益增长&#xff0c;乡村旅游逐渐成为旅游市场的新热点。乡村振兴战略的提出&#xff0c;为乡村旅游的发展提供了新的契机。在这一背景下&#xff0c;如何整合乡村文化资源与旅游资源&#xff0c;发展文化旅游产业&#xf…

搜维尔科技:光学动作捕捉系统用于城市公共安全智慧感知实验室

用户名称&#xff1a;西安科技大学 主要产品&#xff1a;Optitrack Priime41 光学动作捕捉系统&#xff08;8头&#xff09; 在6米8米的空间内&#xff0c;通过8个Optitrack Priime41光学动作捕捉镜头&#xff0c;对人体动作进行捕捉&#xff0c;得到用户想要的人体三维空间坐…

synchronized关键字和ReentrantLock锁区别

synchronized关键字和ReentrantLock锁是Java中用于同步的两个重要机制&#xff0c;它们在很多方面有所不同&#xff1a; 1. **锁定范围**: synchronized关键字只能在方法的执行过程中提供锁定&#xff0c;而ReentrantLock可以锁定任何对象&#xff0c;包括方法、代码块和对象。…

认养小游戏功能介绍

认养小游戏通常模拟了真实的农业生产过程&#xff0c;让玩家能够在线上体验种植、养殖的乐趣。以下是一些常见的认养小游戏功能介绍&#xff1a; 选择认养的农产品&#xff1a;首先&#xff0c;玩家可以从游戏中提供的多种农产品中选择自己想要认养的种类&#xff0c;如蔬菜、…

容器化Jenkins远程发布java应用(方式二:自定义镜像仓库远程拉取构建)

1.创建maven项目 2.配置git、maven 3.阿里控制台>容器镜像服务>镜像仓库>创建镜像仓库 4.执行shell脚本&#xff08;推送镜像到阿里云镜像仓库&#xff09; 使用到登录阿里云仓库命令 #!/bin/bash # 服务名称 SERVER_NAMEplanetflix-app # 镜像tag IMAGE_TAG1.0.0-SN…

JavaWeb之过滤器(Filter)与监听器(Listener)

前言 过滤器(Filter) 1.什么是过滤器 2.过滤器的语法格式 3.使用场景 3.1.如何防止用户未登录就执行后续操作 3.2.设置编码方式--统一设置编码 3.3.加密解密(密码的加密和解密) 3.4.非法文字筛选 3.5.下载资源的限制 监听器(Listener) 1.什么是监听器 2.监听器分类…

5G工业路由器实现驾考科目三实时监控与远程控制

5G驾考路由器的应用主要体现在智能驾考系统中&#xff0c;其优势包括提高考试安全性、效率和规范性&#xff0c;同时杜绝违规行贿作弊的行为。 在驾考系统中&#xff0c;5G工业路由器是数据传输的桥梁设备。车载设备如摄像头、定位系统、硬盘录像机、传感器等&#xff0c;通过串…

DetCLIPv3:面向多功能生成开放词汇的目标检测

DetCLIPv3:面向多功能生成开放词汇的目标检测 摘要IntroductionRelated worksMethod DetCLIPv3: Towards Versatile Generative Open-vocabulary Object Detection 摘要 现有的开词汇目标检测器通常需要用户预设一组类别&#xff0c;这大大限制了它们的应用场景。在本文中&…

07 常用工具集

本课时主要介绍常用的工具&#xff0c;将会讲解三个知识点&#xff1a; JVM 相关工具的作用和适用场景&#xff1b; Git 常用命令和工作流&#xff1b; Linux 系统中常用分析工具。 常用工具汇总 常用工具汇总如下图所示。 说明&#xff1a;这里列出的都是一些相对独立的工…

Edge视频增强功能

edge://flags/#edge-video-super-resolution 搜索Video查找 Microsoft Video Super Resolution 设置为Enabled
最新文章