Linux开发工具——make/Makefile

目录

一、什么是makefile?

二、为什么要有makefile?

三、makefile的使用

1.依赖关系与依赖方法

2.伪目标

3.定义变量

4.特殊符号

四、makefile的执行逻辑


一、什么是makefile?

        Makefile是一种自动化构建工具,make是一条指令,Makefile是一个文件,当我们创建名为Makefile的文件后在Makefile中按照一定的规则制定一些命令。然后我们在命令行输入make命令后会自动执行Makefile文件中的指令。

二、为什么要有makefile?

  • 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作。
  • makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
  • make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Visual C++的nmake,Linux下GNU的make。
  • make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。

三、makefile的使用

首先在我们的项目下创建一个名为Makefile或名为makefile的文件,然后使用vim打开进行编辑。

1.依赖关系与依赖方法

        假如我们有一个code.c文件,现在需要编译生成名为code的可执行文件,我们可以在Makefile中这样写:

code:code.cgcc code.c -o code

依赖关系:就是所要生成的这个目标文件所依赖的文件是哪些。

依赖关系:就是所要生成的这个目标文件所依赖的方法是哪些。

注意:在依赖方法的前面需要加一个Tab制表符,使用4个空格不合法。

在Makefile写完以上指令后我们回到命令行,输入make命令则会有以下效果:

 我们使用make指令后它会自动显示出gcc code.c -o code,如果不想让它显示可以在依赖方法前面加@如:

code:code.c@gcc code.c -o code

2.伪目标

        伪目标文件也就是说它并不会在自己的目录下真生成一个目标文件,它更像是一条指令,用了就没了但是可以多次使用,只要给目标文件用.PHONY修饰那么它就成为伪目标了,如下:

.PHONY:clean
clean:rm -f code

因为生成clean这个目标不需要依赖任何文件所以就不用写。

在命令行执行.PHONY修饰的文件我们需要使用make+伪目标名,比如这里我们可以在命令行输入

make clean

3.定义变量

        在某些时候我们为了方便后期修改通常会用变量来代替各种文件或指令,而在使用时需要用$符号加()可以理解为把它解包装,如把以上的命令全部改为变量的形式:

BIN=code
SRC=code.c
CC=gcc
FLAGS=-o
$(BIN):$(SRC)$(CC) $(SRC) $(FLAGS) $(BIN)

4.特殊符号

%.o表示所有以.o为结尾的文件,同理%.c表示所有以.c结尾的文件。

$@:所有目标文件

$^:所有依赖的文件

$(shell ls *.c)或$(wildcard *.c): 在该目录里的所有以.c结尾的文件

$(SRC: .c = .o):SRC变量名表示的文件的.c变成.o生成新的文件名。

那么我们可以做出以下操作:

BIN=code 
CC=gcc
#SRC=$(shell ls *.c)
SRC=$(wildcard *.c)
OBJ=$(SRC:.c=.o)
LFLAGS=-o
FLAGS=-c
RM=rm -f 
$(BIN):$(OBJ)@$(CC) $(LFLAGS) $@ $^@echo "linking ... $^ to $@"%.o:%.c@$(CC) $(FLAGS) $<@echo "compling ... $< to $@".PHONY:cleanclean:$(RM) $(OBJ) $(BIN)  

注:

  • 其中#表示屏蔽,这跟我们一般写代码用的屏蔽方式不一样
  • 使用echo打出信息可以方便我们知道程序是否在正常执行。
  • 不把源文件直接生成可执行文件而是先生成.o文件是因为后期对部分文件进行修改后可以单独编译再与原来编译好的文件一起做库链接,而不是全部文件重新编译一遍。 而如果直接把源文件生成可执行文件的话,到时候一个文件修改就需要全部文件重新编译一遍,效率非常的低。

四、makefile的执行逻辑

比如我们写这样一段指令:

        上面的指令是能正常运行的,但我们发现在执行第一个语块的时候并没有code.o这个依赖文件,code.o需要在下一个语块中才能生成。其实makefile的执行逻辑是这样的,它在执行到一个文件不完整的语块的时候,会类似的先把它放在一个栈结构中然后往后去执行,直到后面的指令执行完需要它出栈的时候才执行,此时如果该语块依旧文件不完整则会报错。

        一个目标文件被.PHONY修饰后变成伪目标是可以总是被执行的。而一个普通的目标文件只能被执行一次。这也是一种提高编译效率的方式,因为同样的内容已经生成了一份就没必要多次生成。

        而当涉及的依赖文件的内容被修改时make指令才能再次被执行。但是Makefile如何知道某个文件被修改过呢?其实是通过文件的时间属性来判断的,我们可以通过stat+文件名来查看,如:

  • Access时间:文件的最近访问时间。当文件内容被读取时,这个时间戳会更新。
  • Modify时间:文件内容的最近修改时间。当文件的内容发生变化时,这个时间戳会更新。
  • Change时间:文件属性的最近修改时间。这里的文件属性包括文件的权限、所有者、所属组等元数据。

        可以巧记为“ACM”时间。makefile通过比较目标文件与依赖文件的Modify时间,如果依赖文件的Modify时间比目标文件的Modify时间要新,则可以通过make指令再次生成目标文件。

非常感谢您能耐心读完这篇文章。倘若您从中有所收获,还望多多支持呀!74c0781738354c71be3d62e05688fecc.png

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

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

相关文章

BC146 添加逗号

BC146 添加逗号 import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main {public static void main(String[] args) {Scanner in new Scanner(System.in);String str in.next();StringBuilder s new StringBuilder(str);for(int …

【计算机视觉】深入浅出SLAM技术原理

引言 SLAM&#xff08;Simultaneous Localization and Mapping&#xff0c;同步定位与建图&#xff09;是机器人学和计算机视觉中的一个重要技术&#xff0c;它允许机器人在未知环境中自主导航&#xff0c;同时构建环境的地图并确定自身的精确位置。本文将详细介绍SLAM技术的基…

求平面连接线段组成的所有最小闭合区间

这个功能确实非常实用&#xff0c;我在过去开发地面分区编辑器时就曾应用过这一算法。最近&#xff0c;在新产品的开发中再次遇到了类似的需求。尽管之前已经实现过&#xff0c;但由于长时间未接触&#xff0c;对算法的具体细节有所遗忘&#xff0c;导致重新编写时耗费了不少时…

如何才能实时监测Mac的运行状态

实时监测Mac的运行状态&#xff0c;能够让我们更好的了解Mac的情况&#xff0c;因此如何才能监测Mac的运行状态很重要 State&#xff0c;实时监测你的Mac运行状态&#xff0c;能够直观的展示当前Mac的CPU、内存、硬盘、温度、风扇、网络信息以及开机时间等重要信息 除此之外&a…

强化学习介绍

目录标题 一、什么是强化学习二、强化学习的环境三、强化学习的目标四、强化学习中的数据从哪里来五、强化学习的独特性 一、什么是强化学习 强化学习是机器通过与环境交互来实现目标的一种计算方法。 机器和环境的一轮交互是指&#xff0c;机器在环境的一个状态下做一个动作决…

【算法】【优选算法】滑动窗口(上)

目录 一、滑动窗口简介二、209.⻓度最⼩的⼦数组2.1 滑动窗口2.2 暴力枚举 三、3.⽆重复字符的最⻓⼦串3.1 滑动窗口3.2 暴力枚举 四、1004.最⼤连续1的个数III4.1 滑动窗口4.2 暴力枚举 五、1658.将x减到0的最⼩操作数5.1 滑动窗口5.2 暴力枚举 一、滑动窗口简介 其实就是利用…

软考高级之系统架构师系列之构件开发模型

如标题所述&#xff0c;本文面向于软考高级&#xff0c;具体来说是系统架构师。 有些概念&#xff0c;如生命周期&#xff0c;开发的几个阶段&#xff0c;不同的教程有些许出入。 本文偏理论&#xff0c;要在理解的基础上加以记忆&#xff0c;用于应付软考&#xff0c;有些地…

机器人零位、工作空间、坐标系及其变换,以UR5e机器人为例

机器人中的主要坐标系 在机器人中&#xff0c;常用的坐标系包括&#xff1a; 基坐标系&#xff08;Base Frame&#xff09;&#xff1a;固定在机器人基座上的坐标系&#xff0c;用于描述机器人的整体位置和方向&#xff0c;是其他所有坐标系的参考点。 连杆坐标系&#xff08…

VMWARE ESXI VMFS阵列故障 服务器数据恢复

1&#xff1a;河南用户一台DELL R740 3块2.4T硬盘组的RAID5&#xff0c;早期坏了一个盘没有及时更换&#xff0c;这次又坏了一个&#xff0c;导致整组RAID5处于数据丢失的状态&#xff0c; 2&#xff1a;该服务器装的是VMware ESXI 6.7&#xff0c;用户把3块硬盘寄过来进行数据…

程序员开发速查表

作为一名苦逼的程序员&#xff0c;在开发的过程中&#xff0c;我们总是在各种编程语言中来回穿梭&#xff0c;忙完后端整前端&#xff0c;还得做一部分的运维工作&#xff0c;忙的我们有时候忘记语法&#xff0c;忘记编写规则&#xff0c;甚至混淆。这时候我们就希望有一个综合…

「Mac畅玩鸿蒙与硬件30」UI互动应用篇7 - 简易计步器

本篇将带你实现一个简易计步器应用&#xff0c;用户通过点击按钮增加步数并实时查看步数进度&#xff0c;目标步数为 10000 步。该项目示例展示了如何使用 Progress 组件和 Button 组件&#xff0c;并结合状态管理&#xff0c;实现交互式应用。 关键词 UI互动应用计步器Button…

直播系统搭建教程安装说明

需要安装的软件(宝塔【软件商店】中查找安装): 1.PHP7.0 ~ PHP7.3 需要安装的扩展:(宝塔【PHP管理】【安装扩展】中安装) *PDO PHP Extension * MBstring PHP Extension * CURL PHP Extension * Mylsqi PHP Extension * Redis PHP Extension * fileinfo PHP Extension …

@Async注解提升Spring Boot项目中API接口并发能力

文章目录 同步调用异步调用1: 启用异步支持2: 修改 Task 类异步回调基本概念使用 Future<String>使用 CompletableFuture<String>Future<String> 和 CompletableFuture<String>区别1. 基本概念2. 主要区别同步调用 同步调用是最直接的调用方式,调用方…

对齐自治 Aligned autonomy

对于有效的产品开发&#xff0c;我们想要的自主权不是 “随心所欲” &#xff0c;而是一种自主权&#xff0c;使团队能够自由行动&#xff0c;利用他们所有的能力朝着集体成果前进。这也称为“对齐自治”。 Aligned autonomy 2x2&#xff0c;来自 Spotify 的 Henrik Kniberg 工…

Spring Boot 与 Vue 共筑二手书籍交易卓越平台

作者介绍&#xff1a;✌️大厂全栈码农|毕设实战开发&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 &#x1f345;获取源码联系方式请查看文末&#x1f345; 推荐订阅精彩专栏 &#x1f447;&#x1f3fb; 避免错过下次更新 Springboot项目精选实战案例 更多项目…

物理验证Calibre LVS Debug案例之通过deleteEmptyModule解决LVS问题

上周帮助T12nm A55训练营学员debug一个Calibre LVS问题&#xff0c;小编觉得挺好的一个问题。这个问题之前没有遇到过&#xff0c;今天分享给大家。 数字IC后端先进工艺设计实现之TSMC 12nm 6Track工艺数字IC后端实现重点难点盘点 下图所示为Calibre LVS的报告。从报告中看到…

【系统面试篇】进程与线程类(2)(笔记)——进程调度、中断、异常、用户态、核心态

目录 一、相关面试题 1. 进程的调度算法有哪些&#xff1f; 调度原则 &#xff08;1&#xff09;先来先服务调度算法 &#xff08;2&#xff09;最短作业优先调度算法 &#xff08;3&#xff09;高响应比优先调度算法 &#xff08;4&#xff09;时间片轮转调度算法 &am…

这下热闹了:电商巨头粗暴杀入物流自动化领域

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 在全球物流行业竞争日趋白热化的今天&#xff0c;一向以互联网和电商见长的阿里巴巴集团旗下菜鸟&#xff0c;突然以一记重拳杀入物流自动化设备领域。 其自主研发的直线窄带分拣机不…

新安装的Ubuntu 24.04.1安装Python模块报错?(error: externally-managed-environment)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 文章内容 📒📝 错误现象及原因📝 解决方案1. **创建虚拟环境**创建虚拟环境的步骤:2. **使用 pipx 管理应用**安装 `pipx`:3. **直接覆盖安装(不推荐)**4. **使用 `apt` 安装系统级包**📝 总结⚓️ 相关链接 ⚓️�…

前后端分离,Jackson,Long精度丢失

案例:后端接口放回一个Long数据 GetMapping("/testForLong")public Map<String, Object> testForLong() {Map<String, Object> map new HashMap<>();map.put("aaa", 1234567890123456789L);return map;}实际前端接收的数据 前后端数据…