当前位置: 首页 > ai >正文

Makefile---自动化构建和管理项目的文件

1.介绍

  在一个项目中,我们一般为了程序方便维护和提高可读性使用模块化编程,此时会产生许多个源文件和头文件,在进行编译,汇编,链接等操作时会比较繁琐,GNU组织是维护Linux的组织,它集成了MAKE工具方便项目自动化构建和管理,可以在其官网查找make相关文档进行学习。
  make终端命令运行后执行Makefile文件,因此只需先在Makefile文件写好相关命令,然后再在终端调用make命令即可,make命令需要先安装,在Linux终端可以利用命令:sudo apt install make进行安装。
  安装完成后,可以在man手册第1章查看make命令具体介绍,如下:
在这里插入图片描述

  可以发现,make命令是用于解释Makefile这个配置文件的,所以调用make命令前要创建好Makefile文件,Makefile文件命名只能是Makefile或makefile,且没有扩展名。(一般建议命名Makefile跟Readme命名一致,项目文件结构清晰一点)

2.Makefile规则

2.1Makefile基本结构

在这里插入图片描述

  从GNU官网的Makefile文件可以看到,Makefile的基本规则由4个部分组成,即目标,先决条件,制表符,命令。

  • 目标:目标可以是文件名,通过先决条件的文件生成得到目标文件;目标也可以是命令名,比如clean,这种称为伪目标,为了将伪目标与文件目标区分出来,在伪目标后面加上标识:.PHONY:伪目标名字(eg. .PHONYCLEAN),当在终端输入make时执行的是除伪目标外的规则,当在终端输入make 伪目标名字(eg.make clean)才会执行该规则。

一个Makefile文件不应该只有伪目标!!!

  • 先决条件:先决条件就是生成目标文件所需要的文件,比如要生成可执行文件需要.obj文件,那么对应的.obj文件就是先决条件。

  • 制表符:按照标准要求来,按tab键不要按空格!

  • 命令:命令就是要执行的动作,比如gcc -c main.c,每一个命令都是以tab缩进开头。

例子:
如果编译过程有需要多个目标,则终极目标必须写在最顶层!即最终生成的目标文件先写,比如源文件得到可执行文件的过程最终生成可执行文件一步写在最顶层!
在这里插入图片描述

2.3Makefile变量

  在一个项目中我们可能会碰到这样一个情况:项目有许多个实现不同功能的源文件,现在需要先把源文件进行编译,再进行汇编操作,如果我们一个一个把先决条件的文件名打上去需要输入两遍,为了方便,可以用一变量存这许多个文件名,需要用到时引用变量即可,大大提高了效率。
  Makefile的变量分为三种:自定义变量、系统变量、自动化变量。

2.3.1自定义变量

变量这里需要注意的是要用变量的值需要加一个$符号,表示引用,不然就是普通字符。自定义变量顾名思义就是我们自己定义的变量。
在这里插入图片描述

2.3.2系统变量

  系统变量是内核已经存在的一些变量,我们可以直接用,不需要再定义,常见的系统变量如下:
在这里插入图片描述

2.3.1自动化变量

  自动化变量是指变量的值会自动地发生变化,比如@变量代表其所在规则的目标名称,如下面规则@变量的值就是main,假如你把main改成main2那么@的值自动就变成了main2。 在这里插入图片描述
  常见的系统变量如下:在这里插入图片描述

  还有一种常见的匹配规则如下面的$(OBJ):%.o:%.c表示找出OBJ变量里所有的.o文件,对应的每个.o文件匹配对应的.c文件名作为先决条件。
在这里插入图片描述

http://www.xdnf.cn/news/2218.html

相关文章:

  • Java基础 — 循环
  • BS架构与CS架构的对比分析:了解两种架构的不同特点与应用
  • C语言函数调用与声明
  • HTML基础
  • QNX/LINUX/Android系统动态配置动态库.so文件日志打印级别的方法
  • 悟空统计平台在教育行业的落地:课程转化路径优化实践
  • Python 实现从 MP4 视频文件中平均提取指定数量的帧
  • vue3学习之防抖和节流
  • module.noParse(跳过指定文件的依赖解析)
  • Spring Boot安装指南
  • Qt 5.15 编译路径吐槽点
  • QML Date:日期处理示例
  • dijkstra
  • 个人电子白板(svg标签电子画板功能包含正方形、文本、橡皮 (颜色、尺寸、不透明度)、 撤销、取消撤销 等等功能,)
  • 计算机网络基本概念
  • 路由器重分发(OSPF+RIP),RIP充当翻译官,OSPF充当翻译官
  • 强化学习在大模型训练中的应用及策略优化算法详解:以LLM为例
  • 【C++ 类和数据抽象】消息处理示例(1):从设计模式到实战应用
  • Swift与iOS内存管理机制深度剖析
  • Java注解
  • AI辅助设计图转代码开发规范
  • MySQL 分布式架构与实战:从单机到集群的进阶之路(附生产级架构设计)
  • 【微知】sourceinsight如何添加支持bash脚本的语法格式解析?
  • P3309 [SDOI2014] 向量集 Solution
  • React-Hook
  • n8n 中文系列教程_10. 解析n8n中的AI节点:从基础使用到高级Agent开发
  • 【知识管理周报】知识管理最新周报0426文章推荐
  • [详细无套路]MDI Jade6.5安装包下载安装教程
  • HKUST:合成数据训练LLM的缩放定律
  • docker容器运维工具——ctop