
本文共 1886 字,大约阅读时间需要 6 分钟。
Make命令入门
Make 是 Unix/Linux 环境下广泛使用的工具,用于通过定义文件的依赖关系,自动化编译和其他建造任务。它能够通过读取 Makefile 文件,找出需要更新的目标,并执行适当的编译或处理命令,从而节省时间和精力。以下从基础到进阶详细说明 Make 的使用方法和功能。
Make 的退出码
Make 命令执行后会返回三个可能的退出码:
- 0:表示命令成功执行。
- 1:如果 Make 运行时发生任何错误,则返回 1。
- 2:如果使用了 "-q" 选项且某些目标不需要更新,则返回 2。
这些退出码对于检查 Make 命令的执行结果非常有用。
指定 Makefile
Make默认情况下在当前目录下依次搜索 "GNUmakefile"、"makefile" 和 "Makefile"这三个文件。如果找到其中一个文件,就读取这个文件并执行。然而,可以通过提供 "-f" 或 "--file" 选项来指定特定的 Makefile。例如,若有 Makefile 名为 "hchen.mk",可以这样执行:
make -f hchen.mk
如果多次使用 "-f" 参数,则会将所有指定的 Makefile 连接一起传递给 Make。
指定目标
Make 的默认目标是 Makefile 中第一个目标,其余目标通常是由这个目标依赖的。然而,可以通过在命令后直接指定目标来改变执行顺序。例如:
make clean
指定目标时,目标名称应避免包含冒号、等号或双减号(即不推荐使用含有这些字符的目标)。此外,隐含目标(基于文件扩展名或依赖关系推导的目标)也可以作为终极目标。
all
和 clean
是常见的伪目标。all
通常用于编译所有目标文件,而 clean
则用于清理。
检查规则
通过使用以下参数,可以检查 Makefile 中的规则和命令而不执行:
- "-n": 打印事件序列而不执行。
- "--just-print": 与 "-n" 相同。
- "--dry-run": 与 "-n" 相同。
- "--recon": 与 "-n" 相同。
这些参数在调试 Makefile 时非常有用。例如,可以通过组合 "--what-if=foo.c" 和 "-n" 查看目标 foo.o
更新时的规则。
Make 的参数
GNU Make 3.80 其主要参数如下:
基础参数
- "-b": 忽略 Make 的版本兼容性。
- "-m": 忽略环境变量 MAKEFLAGS。
目录参数
- "-C <路径>": 指定 Makefile 的目录。多个 "-C" 参数会按顺序处理,最终目录为最新路径。
调试参数
"--debug[=<级别>]": 输出调试信息,默认为简单调试。选项包括:
- a: 输出全部调试信息。
- b: 输出基本调试信息。
- v: 输出详细信息,包括文件名和行号。
- i: 输出隐含规则。
- j: 输出命令的详细执行过程,包括 PID 和返回码。
"-d": 等同于 "--debug=a"。
环境参数
- "-e": 覆盖 Makefile 中定义的环境变量。
执行方式
- "-f
" : 指定 Makefile 文件。 - "--file=
" : 与 "-f" 相同。
日志和输出
- "-h": 显示帮助信息。
- "--help": 与 "-h" 相同。
运行选项
- "-i": 忽略错误。
- "-r": 禁止隐含规则。
- "-R": 禁止隐含变量规则。
- "-s": 静默模式,不输出命令输出。
- "-S": 取消 "-k" 的作用。
更新控制
- "-k": 继续执行即使有错误。
- "-t": 类似 UNIX 的 touch 命令,更新目标文件的访问时间。
版本信息
- "-v": 输出 Make 的版本和版权信息。
附加功能
- "-w": 输出当前目录的信息。
- "--print-directory": 与 "-w" 相同。
- "--no-print-directory": 禁止 "-w" 选项。
常用示例
- 编译所有目标:
make all
- 清理目标:
make clean
- 单独编译目标:
make obj.o
- 打印规则而不执行:
make -n
通过树状结构的 Makefile,可以定义复杂的编译和依赖关系。例如,定义清理步骤:
all: $(CC) -c *.c $(LINKER) -o bin/myappclean: rm -f *.o bin/myapp
提示:确保目标文件名不含双减号或冒号。Make 将目标文件名中的 . 转换为相应的扩展名(如 .c -> .o)。
发表评论
最新留言
关于作者
