Linux自动化构建工具—make/makeflie

目录

1、为什么我们需要make和makefile

2、makefile文件的基本语法

makefile文件的语法和make指令的用法

定义变量

3、PHONY关键字

.PHONY 的语法

为什么需要.PHONY?


1、为什么我们需要make和makefile

makeMakefile 是软件开发中用于自动化构建和管理代码编译流程的工具

当项目包含多个源文件(如 C/C++ 的 .c 和 .h 文件)时,手动编译每个文件并链接成可执行文件非常繁琐。

makefile 可以定义一套规则,告诉编译器如何自动完成编译、链接、清理等操作。

make是一个命令,执行该命令需要当前操作目录下有一个名为makefile或者Makefile的文件。

我们只需输入make命令,即可一键完成整个构建流程,无需手动输入冗长的编译命令。

对于test.c,没有写好makefil时我们需要在命令行中现写gcc命令编译,使用make就可以在makefile中提前写好需要的命令,编译时使用make一键编译,方便其他人直接编译文件。而不是每次编译都要一行一行敲指令。

写好了makefile之后,我们就可以在这个目录下使用make一键编译了。

输入make clean,就是指定执行clean任务,不会执行编译任务,即执行makefile文件中clean后面的指令。

那么我们在makefile里编写的代码是什么意思呢?

test:test.cgcc -o test test.c
clean:rm -f test

其中test:test.c表示一个依赖关系,由冒号隔开,冒号左边的叫目标文件,右边的叫依赖文件,冒号右边也可以是依赖文件列表,可以由多个源文件编译成可执行文件。

gcc -o test test.c就是依赖方法。

clean又是另外一个任务。


2、makefile文件的基本语法

我们首先要理清楚make和makefile文件的概念、功能及它们之间的关系。

make 是一个命令行工具,用于自动化执行代码编译、链接、测试、清理等任务。

makefile 是一个文本配置文件,定义了构建项目的规则和依赖关系。

make

Makefile
是一个命令行工具是一个配置文件
负责解析依赖关系和执行命令负责定义依赖关系和命令规则
根据 Makefile 的规则工作是 make 工具的“说明书”

我们可以大致总结一下:

make 是工具,提供构建的逻辑(如何判断是否需要构建)。Makefile 是规则,提供构建的内容(构建什么、依赖什么、如何构建)。


makefile文件的语法和make指令的用法

目标文件:依赖文件列表

        依赖方法

只是输入make指令时,默认只会执行makefile中的第一个任务,任务执行成功后不再执行后续任务,像上面我们写了一个编译任务,一个删除任务,执行完了编译任务后,删除任务不再执行。

当然,我们也可以指定任务执行。

像上面我们讲的make clean就是一个指定任务的执行,clean不需要任何依赖文件。

在makefile中,依赖方法的指令内部的目标文件可以用$@代替,依赖文件列表可用$^代替。

test:test.cgcc -o $@ $^

这里的gcc -o $@ $^ 相当于 gcc -o test test.c

定义变量

dst=test
src=test.c$(dst):$(src)gcc -o $(dst) $(src)  

这里我们将test赋予dst,test.c赋予src,这样dst的值就是test,src的值就是test.c,使用$(变量名)就可以代替源文件名。


3、PHONY关键字

当我们连续make的时候,会提示我们文件已经是最新的了,那么系统是如何识别的呢?

当我们再次使用make指令时,如果源代码没有被修改过,make不会帮我们再次编译文件,对于一个没有修改过的文件,再一次编译就是纯纯的浪费资源,所以为了提高编译效率,make不会对一个没有被修改过的文件进行再次编译。

系统是怎么知道代码有没有被修改过呢?

从逻辑上讲可执行文件的时间不可能和源文件的时间相同。因为必须要先有源文件才能够有可执行文件,那么就得到了一个结论:源文件的创建时间一定早于可执行文件的创建时间,修改后源文件的最近一次修改时间一定晚于可执行文件的创建时间

所以,系统只需要对比源文件最晚的修改时间和可执行文件的时间,就可以知道是否要重新编译

如果源文件的时间晚于可执行文件的时间。说明源文件被修改过了,因此就需要重新编译。
如果源文件的时间早于可执行文件的时间。说明源文件没有修改,不需要重新编译。

查看时间指令

stat 文件名

Access:最近一次访问文件的时间
Modify:最近一次修改文本的时间
Change:最近一次改变文件属性的时间。

如果我们要强制重复执行make命令,忽略之前的test文件,这时候可以使用PHONY指令。

.PHONY 的语法

.PHONY: 目标1 目标2 ...

例如我们在makefile使用了PHONY

此时每次使用make都会强制执行

在makefile中,.PHONY 是一个特殊的关键字,用于声明一个目标是"伪目标"伪目标不生成任何实际的文件,而是用于执行一系列命令(例如清理临时文件、运行测试、安装程序等)。它的核心作用是避免目标名称与文件名的冲突,并确保每次调用该目标时,其关联的命令都会被执行

为什么需要.PHONY?

假如我们定义了一个目标任务clean,用来清理文件

clean:rm -f test

如果没有声明 .PHONY,当目录中恰好存在一个名为clean的文件时,make工具会认为clean已经是最新状态(因为clean文件没有依赖项),从而跳过 rm 命令的执行。这样我们就无法执行清理文件的命令了。

通过声明 .PHONY,就可以明确地告诉make,clean 是一个伪目标,不要将其视为文件,从而确保每次运行make clean时,命令都会执行。


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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用DeepSeek完成一个简单嵌入式开发

开启DeepSeek对话 请帮我使用Altium Designer设计原理图、PCB,使用keil完成代码编写;要求:使用stm32F103RCT6为主控芯片,控制3个流水灯的原理图 这里需要注意,每次DeepSeek的回答都不太一样。 DeepSeek回答 以下是使…

OSPF-2 邻接建立关系

上一期我们说了OSPF的邻居建立关系以及OSPF邻居关系建立中建立失败的因素以及相关实验案例 这一期我们来说说OSPF的邻接关系建立时需要交互哪些报文以及失败因素及原因和相关实验案例 一、概述 在运行了OSPF的网络当中为了交互链路状态信息和路由信息,互相之间需要建立邻接关…

app.config.globalProperties

目录 一:基础使用 1、简介 2、使用 3、打印结果: 二:封装 1、创建一个.ts文件(utils/msg.ts) 2、在main.ts中全局注册 3、在页面中使用 4、打印结果 一:基础使用 1、简介 app.config.globalProperties 是 Vue 3 应用实例(app)的一个配置属性&…

初探大模型开发:使用 LangChain 和 DeepSeek 构建简单 Demo

最近,我开始接触大模型开发,并尝试使用 LangChain 和 DeepSeek 构建了一个简单的 Demo。通过这个 Demo,我不仅加深了对大模型的理解,还体验到了 LangChain 和 DeepSeek 的强大功能。下面,我将分享我的开发过程以及一些…

基于RWA 与 AI-Agent 协同的企业数字化生态构建

在当前数字经济高速发展的背景下,企业数字化转型已成为提升竞争力和创新能力的必由之路。以实体零售与文旅行业为代表的传统产业,正通过现实世界资产(RWA)数字化与人工智能代理(AI-Agent)的协同应用&#x…

专题地图的立体表达-基于QGIS和PPT的“千层饼”视图制作实践

目录 前言 一、QGIS准备基础数据 1、QGIS 相关插件 2、图层标绘操作 二、PPT中制作 1、调整图片的规格 2、设置旋转 3、添加文字 三、总结 前言 在信息爆炸的时代,数据的可视化呈现变得愈发关键,而专题地图作为传递地理空间信息的有力工具&#…

3D文物线上展览如何实现?

3D文物线上展览的实现主要依赖于一系列先进的数字技术和创新手段,以下是实现3D文物线上展览的关键步骤和技术要点: 一、文物数字化采集与建模 高精度扫描: 使用专业的3D扫描仪对文物进行高精度扫描,获取文物的三维数据。积木易…

SpringCloud 学习笔记1(Spring概述、工程搭建、注册中心、负载均衡、 SpringCloud LoadBalancer)

文章目录 SpringCloudSpringCloud 概述集群和分布式集群和分布式的区别和联系 微服务什么是微服务?分布式架构和微服务架构的区别微服务的优缺点?拆分微服务原则 什么是 SpringCloud ?核心功能与组件 工程搭建父项目的 pom 文件 注册中心Rest…

1140:验证子串--next.data()、KMP和find

1140:验证子串--KMP 题目 解析next.data()KMP代码Find代码 题目 解析 对于字符串的匹配常见的KMP算法【面试常考】 KMP中需要注意的是:应该从下标1开始遍历,因为下标0前面无值,不能匹配next 固在循环外应初始next[0]0;//易忘点 …

Python 实现大文件的高并发下载

项目背景 基于一个 scrapy-redis 搭建的分布式系统,所有item都通过重写 pipeline 存储到 redis 的 list 中。这里我通过代码演示如何基于线程池 协程实现对 item 的中文件下载。 Item 结构 目的是为了下载 item 中 attachments 保存的附件内容。 {"crawl_tim…

ubuntu中用docker下载opengauss

1.安装docker sudo apt install docker.io2.拉取opengauss镜像 sudo docker pull enmotech/opengauss3.创建容器 sudo docker run --name opengauss --privilegedtrue -d -e GS_PASSWORDEnmo123 enmotech/opengauss:latest3.5.如果容器停止运行(比如关机了&#…

从零基础到能独立设计单片机产品,一般需要经历哪些学习阶段?

相信很多人,内心都有“钢铁侠”的幻想,成为能写程序,能设计硬件,能设计结构,能焊接的全能型人才。 上次徐工问我,如果你财富自由了,想去做啥? 我说出来,可能大家都不信&a…

cursor中git提交记录出现 签出(已分离)

我当时在cursor中的git记录右键点击 签出(已分离) 就导致最左边的记录图标的颜色由蓝色变为了橙色 后面提交的记录都不在显示本地分支和远程分支 创建新分支:在您当前的分离HEAD状态下,创建一个新的分支来保存这些提交。 git checkout -b new-branch-nam…

软件测试之测试用例

1. 什么是测试用例 测试用例(TestCase)是为了实施测试而向被测试的系统提供的一组集合,这组集合包含:测试环境、操作步骤、测试数据、预期结果等要素。 设计测试⽤例原则⼀: 测试⽤例中⼀个必需部分是对预期输出或结果进⾏定义 使…

Unity2D 井字棋

Unity版本2022.3 场景布置 其中可以通过给Board对象添加Grid Layout Group,然后设置每个子物体所占宽高快速排整齐。用完删掉。每个落子的方格ChessBox都是一个Button。 根据Board的宽高除以三即可。 然后隐藏按钮,通过设置alpha值实现。 将ChessBox的…

专题三搜索插入位置

1.题目 题目分析: 给一个目标值,然后要在排序的整数数组中,找到跟目标值一样的,如果没有就把这个值插入进去,然后返回插入后的下标。 2.算法原理 根据题目的时间复杂度可以知道要用二分,开始划分区域&…

正式进入linux 1.0

切记:在Linux中空格很重要 回车键也很重要,不要按两次回车键 ls是显示当前所有文件夹 具体解释: 前面的东西是用户名 后面的是设备名(计算机名) 这是因为linux允许不同用户在终端下进行操作,这么做可以…

分页查询的实现

目录 前言 一.问题描述 二.后端实现步骤 2.1配置PageHelper插件 ①导入依赖 ②在application.yml配置文件中添加相关配置 2.2编写一个入门的程序,体验分页过程 2.3定义一个vo,用来收集分页后的所有信息 2.4修改serviceImpl层的代码 2.5动态设…

16003. orin camera 相机驱动源码 imx477分析记录

文章目录 1 背景2 原理图2.1 CAM_MUX_SEL 4 lane 选通2.2 J21 和 J20 原理图3 驱动源码及设备树3.1 子设备树 tegra234-p3768-camera-rbpcv3-imx477.dtsi3.2 顶层设备树 tegra234-camera-rbpcv3-imx477.dtsi3.2.1 tegra-capture-vi 视频输入子系统节点配置.3.2.2 host1x 主机控…

无标签数据增强+高效注意力GAN:基于CARLA的夜间车辆检测精度跃升

目录 一、摘要 二、引言 三、框架 四、方法 生成合成夜间数据 昼夜图像风格转换 针对夜间图像的无标签数据增强技术 五、Coovally AI模型训练与应用平台 六、实验 数据 图像风格转换 夜间车辆检测和分类 结论 论文题目:ENHANCING NIGHTTIME VEHICLE D…