在Linux环境中,
make
是一个非常强大的工具,用于自动编译和构建程序。它通过读取名为Makefile
(或makefile,大小写不敏感)的特殊文件来确定如何编译和链接程序的不同部分。当执行make时,make会在当前的目录下查找makefile这个文本文件,而makefile里面则记录了源代码如何编译的详细信息。make会自动地判别源代码是否经过变动了,而自动更新执行文件。
对于具体使用make,直接查看 2.1选项部分
- Makefile结构:Makefile由一系列规则组成,每个规则描述了如何生成一个或多个目标文件(通常是可执行文件或库文件)。每个规则的基本结构包括目标(target)、依赖(dependencies)和命令(commands)。
- 目标(target):你想生成的文件或执行的动作。
- 依赖(dependencies):生成目标所需要的文件或目标。
- 命令(commands):当目标的任何一个依赖比目标新,或者目标不存在时,需要执行的shell命令。
- 默认目标:不带任何参数运行
make
时,默认尝试构建第一个目标(通常是all
)。- 指定目标:可以通过
make target_name
来指定构建特定的目标。- 清理:通常会在Makefile中定义一个
clean
目标来删除编译过程中产生的中间文件,如make clean
。
- hello: main.o factorial.o hello.o
- gcc -o hello main.o factorial.o hello.o
-
- main.o: main.c
- gcc -c main.c
-
- factorial.o: factorial.c
- gcc -c factorial.c
-
- hello.o: hello.c
- gcc -c hello.c
-
- clean:
- rm -f *.o hello
在这个例子中,hello
是最终的可执行文件,依赖于main.o
、factorial.o
和hello.o
三个对象文件。每一条规则的下方是构建这些目标所需的编译命令。
- 变量:可以在Makefile中定义变量来简化命令,如
CC=gcc
定义编译器。- 自动推导:make能够根据文件的后缀自动推断如何编译,例如
.c
文件默认使用cc
或gcc
编译。
最为常用的是: make -j
Usage | 全称 | Role | Demo |
-f | --file | 指定使用哪个Makefile文件 | make -f my_makefile |
-jN | 并行编译,N表示同时运行的作业数 | make -j 或 make -j4 | |
-n | --just-print | 打印要执行的命令,但不实际执行 | make -n |
-q | --question | 查询模式,检查指定目标是否需要更新,不输出也不执行命令 | make -q |
-B | --always-make | 无条件重新编译所有目标 | make -B |
-C dir | 改变目录到dir后再执行make | make -C subdir |
使用 make --help
或 man make
可以查看详细的帮助文档和所有可用的选项。
- 理解依赖关系:确保Makefile正确反映了文件之间的依赖关系。
- 增量编译:make只会重新编译那些比目标新的源文件,大大节省时间。
- 调试Makefile:使用
-p
选项查看make的内部数据库,有助于调试复杂的Makefile。