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./表示头文件路径为./
  • 特殊符号:
    • $符号:引用$之后紧接着的对象
    • @符号:转义,表示所属的规则条目的目标文件。用法:如@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   Mju_halcyon  阅读(87)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示