Makefile--Make运行
发布日期:2021-05-24 22:26:47 浏览次数:12 分类:精选文章

本文共 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

指定目标时,目标名称应避免包含冒号、等号或双减号(即不推荐使用含有这些字符的目标)。此外,隐含目标(基于文件扩展名或依赖关系推导的目标)也可以作为终极目标。

allclean 是常见的伪目标。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)。

上一篇:Makefile--隐含规则
下一篇:Makefile--使用函数

发表评论

最新留言

很好
[***.229.124.182]2025年04月23日 06时37分04秒