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

Linux-自动化构建make/makefile(初识)

1.认识

makefile是一个文件(该文件中写了如何编译代码,形成可执行程序),make是一条命令,写好了makefile之后,再make一下,整个工程就会自动编译,提高了软件开发的效率

2.重要性

2.1依赖关系和依赖方法

makefile的本质是依赖关系和依赖方法的结合

(第一行是依赖关系,第二行是依赖方法,第二行以tab键开头)

只需要make,即可执行proc的编译工作

.PHNOY:声明一个伪目标,让目标文件对应的方法总是被执行的

第一个clean:是伪目标的名称,可以随便起,这里是起清理作用的

第二个clean:是一行依赖关系,但是没有依赖文件列表

rm -f proc.c:是依赖方法(要形成clean目标文件就要执行他的依赖方法)

只需要make clean即可执行清理方法

2.2make/makefile的基本原理

  • makefile文件,会被make从上到下开始扫描,第一个目标名,是缺省形成的。如果我们要执行其他组的依赖关系和依赖方法,要make name(但是一般把形成可执行程序放在第一个)
  • makefile在执行gcc命令的时候,如果发生了语法错误,会终止推导过程
  • 依赖方法可以是任何指令,并会进行回显,如果想要关闭回显,那么在指令前+@,eg:

  • make解释makefile的时候,会 自动推导,推导过程 不执行依赖方法,直到推导到有依赖文件存在,然后再逆向的执行所有的依赖方法

(如图所示,proc依赖于proc.o文件[不存在->将命令入栈],proc.o依赖于proc.s文件[不存在->将命令入栈],proc.s依赖于proc.i文件[不存在->将命令入栈],proc.i文件-依赖于proc.c文件[存在->执行gcc -E proc.c -o proc.i命令],以此类推)

  • make默认只形成一个可执行程序,见5(大标题)

3.为什么有时候需要重新编译,有时候不需要

根据对比文件的Mtime做到的,对于源文件.c和可执行程序.exe,.c的时间更加新,则需要重新编;.exe的时间更加新,则不需要重新编。

.PHONY:让依赖方法忽视掉时间对比,这样程序就会被一直执行了。

(rm -f proc)本来就不关心时间

(eg:编译了一遍之后就已经是最新的(up to date),无法进行编译了)

(但是我们如果把.PHNOY放到proc之前)

这样就可以一直make了,因为忽略了时间,.PHONY让总是被做到

4.makefile中的特殊符号

%:是makefile语法中的通配符

%.c:会把当前目录下所有 的.c文件,展开到依赖列表中

$<:右侧的依赖文件,一个一个的交给gcc -c选项,形成同名的.o文件

$^:把所有的依赖文件列表全部交给gcc -c选项,形成同名.o文件

$@:代表目标文件列表

makefile中也可以定义变量,如上图所示

bin和src就相当于变量,要使用的话就$()即可;proc和proc.c是目标文件,

(最终写成的样子)

5.一次形成多个可执行文件

(记得在bin1和bin2之间加空格)

http://www.dtcms.com/a/548796.html

相关文章:

  • 【android bluetooth 协议分析 14】【HFP详解 2】【蓝牙电话绝对音量详解】
  • 【实战总结】MySQL日志文件位置大全:附查找脚本和权限解决方案
  • 系统架构设计师备考第60天——嵌入式硬件体系软件架构
  • Kubernetes(K8s)基础知识与部署
  • 嵊州做网站钻磊云主机
  • 网站建设时间及简介靖安县城乡规划建设局网站
  • 记一次从文件读取到getshell
  • 从顶流综述,发现具身智能的关键拼图----具身智能的内部模拟器:World Model如何成为AI走向真实世界的关键技术
  • 学习笔记—契比雪夫多项式和契比图过滤器
  • 【机器学习入门】9.2:感知机 Python 实践代码模板(苹果香蕉分类任务适配)
  • 大会的网站架构企业网站设计的基本内容包括哪些
  • 打印对称的X。
  • 生产管理系统详解:生产产品,bom,生产线,生产工序,bom清单,生产订单,生产任务单,他们之间的关系梳理
  • 企业微信SCRM系统有什么作用,满足哪些功能?从获客到提效的功能适配逻辑
  • JS如何操作IndexedDB
  • 网站正在维护中wordpress 评分
  • Kafka关闭日志,启动一直打印日志
  • 搬家网站建设思路荆门哪里有专门做企业网站的
  • 前后端分离
  • curl开发常用方法总结
  • rust实战:基础框架Rust + Tauri Windows 桌面应用开发文档
  • knife4j在配置文件(xml文件)的配置错误
  • Java的多线程——多线程(二)
  • 小企业也能用AI?低成本智能转型实战案例
  • ros2 播放 ros1 bag
  • 网页设计做一个网站设计之家官方网站
  • 基于STM32单片机 + DeepSeek-OCR 的智能文档扫描助手设计与实现
  • 微信小程序如何传递参数
  • 【数据结构】:数组及特殊矩阵
  • 记录一下微信小程序里使用SSE