make与Makefile学习
0 引言
makefile文件需要按照某种语法进行编写,用于说明如何编译各个源文件并连接生成可执行文件,并要求定义源文件之间的依赖关系。在Unix系统中,makefile文件的文件名一般是Makefile,也可以通过命令修改(此处不展开介绍)。
make是一个命令工具,可以简化编译过程里面所下达的指令,当执行 make 时,make 会在当前的目录下搜寻 Makefile (or makefile) 这个文本文件,执行对应的操作。make会检查原始码是否经过变动、并只重新编译变动的部分。
本文目的是介绍makefile的基本编写与使用,仅用于博主自己入门或供初学者参考,欢迎批评指正~
1 makefile的基本规则
1.1 makefile由宏定义、库的引用和多个规则条目构成。
每个规则条目的结构如下:
目标文件:依赖的目标文件1 依赖的目标文件2 ... ...
<制表符>(编译/链接命令、或者要执行的动作)
注意:
①第二行开始的制表符是不可少的;
②依赖的目标文件太多或名字太长时,可以在行末加反斜杠"\"表示不换行、继续添加;
③目标文件可以是可执行文件(如main)、中间对象文件(如main.o、fun.o),或者是从编译到链接的文件(如.cpp.o)。
此外,规则条目可以是对特殊标记的定义(如all、clean),如:
- all:目标文件1 目标文件2 目标文件3 ... ...
- clean:
- rm -rf *.o *.a main
1.2 一个实际的例子(包含两条规则):
1 main : main.o 2 g++ -o $@ $^ 3 4 .cpp.o: 5 g++ -c -o $@ $<
2 其他说明
- 需要掌握基本的gcc或g++命令,遇到细节再逐个查询。如g++工具的-I选项的应用:
- 在makefile里设置头文件路径:
- HEADER = -I./
- -I (大写i)表示设置头文件路径,-I./表示头文件路径为./
- 在makefile里设置头文件路径:
- 特殊符号:
- $符号:引用$之后紧接着的对象
- @符号:转义,表示所属的规则条目的目标文件。用法:如@echo xxxx、$@
- ^符号:转义,表示所属的规则条目目标文件的所有依赖文件。用法:如$^
- <符号:转义,表示所属的规则条目的第一个目标文件。用法:如$<
- make的隐含规则:一套默认、隐含的规则,定义了如何从不同的依赖文件建立特定类型的目标。
- Unix系统通常支持一种基于文件扩展名即文件名后缀的隐含规则。这种后缀规则定义了如何将一个具有特定文件名后缀的文件(例如.c文件),转换成为具有另一种文件名后缀的文件(例如.o文件)
- 伪目标的声明与使用
- makefile里伪目标用.PHONY进行声明。当一个目标被声明为伪目标后,make在执行规则时不会去试图去查找隐含规则来创建它。这样就提高了make的执行效率,也解决了文件目录中如果出现名为clean文件,clean操作不被执行的问题
- 静态链接库:as命令
- 动态链接库
- 整合子目录下的makefile文件
- 使用make的其他可选项
主要参考资料
(按推荐程度由高到低排序)
- 程序大飞的博客-linux编程入门(六)-编写Makefile文件
- 专注it的博客-Makefile 中:= ?= += =的区别
- https://blog.csdn.net/wangqingchuan92/article/details/92832544
- https://www.cnblogs.com/goodcandle/archive/2005/11/17/278702.html
posted on 2022-01-14 13:38 Mju_halcyon 阅读(87) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~