Linux开发工具——make/Makefile

news2024/11/25 16:34:15

目录

一、什么是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.c
    gcc 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:clean
 clean:
     $(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.coloradmin.cn/o/2234267.html

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

相关文章

开发中使用UML的流程_01概述

目录 CIM-1:定义业务流程 CIM-2:分析业务流程 ​CIM-3:定义系统范围 ​PIM-1:分析系统流程 PIM-2:分析业务规则 PIM-3:定义静态结构 PIM-4:定义操作和方法 开发中使用UML的流程,主要分为7部分,具体如下: CIM-1:定义业务流程 定义及分析业务流程是为了尽快理…

前端开发模板Pear Admin Layui

目录 基本资料学习笔记04-Pear-Admin-Layui模板运行05-Pear-Admin-Layui-GIT方式代...06-Pear-Admin与Vue对比 & 07-Pear-Admin与Vue对比补充09-Pear-Admin-CRUD练习-数据库表创建12-Pear-Admin-CRUD练习-引入其它依赖 & 13-Pear-Admin-CRUD练习-三层架构以及常见配置 …

[MySQL#10] 索引底层(1) | Page | 页目录

目录 1. 初识索引 2. 认识磁盘 3. MySQL与磁盘交互基本单位 4. 索引的理解 1. 重谈Page 2. 为什么IO交互要用Page 3. 有主键的表插入数据时的排序 4. 单个Page与多个Page 4.1 单个Page 4.2 多个Page 目录 单Page目录 多Page目录 在看本文之前&#xff0c;可以回顾…

.net c# 使用 MailKit库接收139邮箱邮件

开发工具 vs2022&#xff0c;新建-控制台应用。项目完整代码下载&#xff1a; 要安装MailKit库 using MailKit; using MailKit.Net.Imap; using MimeKit; using System.Text; namespace MailKit_mail {internal class Program{static void Main(string[] args){//需要使用 Ma…

Centos开机自启动脚本示例

本文建议创建一个sh文件管理自启动的各项内容&#xff0c;再将sh文件设置开机启动 在/root/autoshell下创建一个autostart.sh&#xff0c;内容如下 #!/bin/bash # description:开机自启脚本# 启动mongodb sh /root/software/mongodb-linux-x86_64-rhel70-4.0.6/bin/mongod --c…

虚拟现实和增强现实技术,如何打造沉浸式体验?

内容概要 在这个科技飞速发展的时代&#xff0c;虚拟现实&#xff08;VR&#xff09;与增强现实&#xff08;AR&#xff09;技术的结合就像调皮的小精灵&#xff0c;一下子把我们的生活变得神奇又有趣。想象一下&#xff0c;你正在游戏中与精灵搏斗&#xff0c;突然间身边的客…

计算机网络 TCP/IP体系 数据链路层

一. 数据链路层的基本概念 数据链路层主要负责节点之间的通信&#xff0c;确保从物理层接收到的数据能够准确无误地传输到网络层。 数据链路层使用的信道主要有以下两种类型: 点对点信道: 这种信道使用一对一的点对点通信方式。广播信道: 这种信道使用一对多的广播通信方式,…

数据结构————链表

一、引言 1. 中间/头部的插入删除&#xff0c;时间复杂度为O(N) 2. 增容需要申请新空间&#xff0c;拷贝数据&#xff0c;释放旧空间。会有不小的消耗。 3. 增容一般是呈2倍的增长&#xff0c;势必会有一定的空间浪费。例如当前容量为100&#xff0c;满了以后增容到200&#x…

【网络原理】深入理解关于HTTP协议和报文的格式以及重要的属性

前言 &#x1f31f;&#x1f31f;本期讲解关于HTTP协议的重要的机制~~~ &#x1f308;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondlctrl-CSDN博客 &#x1f525; 你的点赞就是小编不断更新的最大动力 &#x1f386;那么废话不…

【MyBatis源码】CacheKey缓存键的原理分析

文章目录 Mybatis缓存设计缓存KEY的设计CacheKey类主体CacheKey组成CacheKey如何保证缓存key的唯一性 Mybatis缓存设计 MyBatis 每秒过滤众多数据库查询操作&#xff0c;这对 MyBatis 缓存键的设计提出了很高的要求。MyBatis缓存键要满足以下几点。 无碰撞&#xff1a;必须保证…

面试题:JVM(二)

1. 面试题 简述 Java 类加载机制?&#xff08;百度&#xff09; JVM类加载机制 &#xff08;滴滴&#xff09; JVM中类加载机制&#xff0c;类加载过程&#xff0c;什么是双亲委派模型&#xff1f; &#xff08;腾讯&#xff09; JVM的类加载机制是什么&#xff1f; &#x…

数据库的使用02:SQLServer的连接字符串、备份、还原、SQL监视相关设置

目录 一、连接字符串 【本地连接字符串】 【远程连接字符串】 二、备份 三、还原 &#xff08;1&#xff09;还原数据库-bak、btn文件 &#xff08;2&#xff09;附加数据库mdf文件 四、SQL监视器的使用 一、连接字符串 【本地连接字符串】 server DESKTOP-FTH2P3S; Da…

【2024工业图像异常检测文献】UCAD: 使用对比学习提示的无监督连续异常检测方法

Unsupervised Continual Anomaly Detection with Contrastively-learned Prompt 1、Background 无监督异常检测&#xff08;UAD&#xff09;专注于在没有先验知识或标记实例的情况下识别数据中的不寻常模式或异常值&#xff0c;仅依赖于“正常”数据的内在分布&#xff08;Cha…

【算法】Floyd多源最短路径算法

目录 一、概念 二、思路 三、代码 一、概念 在前面的学习中&#xff0c;我们已经接触了Dijkstra、Bellman-Ford等单源最短路径算法。但首先我们要知道何为单源最短路径&#xff0c;何为多源最短路径 单源最短路径&#xff1a;从图中选取一点&#xff0c;求这个点到图中其他…

[C++]——哈希(附源码)

目录 ​编辑 ​编辑 一、前言 二、正文 2.1 unorder系列关联式容器 2.1.1 unordered_map 2.1.1.1 unorderer_map的介绍 ①unordered_map的构造 ②unordered_map的容量 ③unordered_map的迭代器 ④unordered_map的元素访问 ⑤unordered_map的查询 ⑥unordered_map的修改操…

使用Ubuntu快速部署MinIO对象存储

想拥有自己的私有云存储&#xff0c;安全可靠又高效&#xff1f;MinIO是你的理想选择&#xff01;这篇文章将手把手教你如何在Ubuntu 22.04服务器上部署MinIO&#xff0c;并使用Nginx反向代理和Let’s Encrypt证书进行安全加固。 即使你是新手&#xff0c;也能轻松完成&#xf…

Maven 下载配置 详解 我的学习笔记

Maven 下载配置 详解 我的学习笔记 一、Maven 简介二、maven安装配置三、maven基本使用四、idea配置mavenidea配置maven环境maven坐标idea创建maven项目配置Maven-Helper插件 五、依赖管理 一、Maven 简介 Apache Maven 是一个项目管理和构建工具&#xff0c;它基于项目对象模型…

一文带你了解,全国职业院校技能大赛老年护理与保健赛项如何备赛

老年护理与保健&#xff0c;作为2023年全国职业院校技能大赛的新增赛项&#xff0c;紧密贴合党的二十大精神&#xff0c;致力于加速健康与养老产业的蓬勃发展&#xff0c;并深化医养康养结合的服务模式。此赛项不仅承载着立德树人的教育使命&#xff0c;更通过竞赛的引领作用&a…

STM32ZET6-USART使用

一、原理说明 STM32自带通讯接口 通讯目的 通信方式&#xff1a; 全双工&#xff1a;通信时可以双方同时通信。 半双工&#xff1a;通信时同一时间只能一个设备发送数据&#xff0c;其他设备接收。 单工&#xff1a;只能一个设备发送到另一个设备&#xff0c;例如USART只有…

电话语音机器人,是由哪些功能构成?

电话语音机器人是自动电话销售、筛选意向客户的&#xff0c;只要录入好行业话术&#xff0c;导入要拨打的手机号&#xff0c;机器人就可以上岗工作了。 电话语音机器人组成部分&#xff1a; 1、语音识别器&#xff0c;主要作用&#xff1a;识别客户讲话内容&#xff0c;从而做…