博客
关于我
Makefile--Make运行
阅读量:724 次
发布时间:2019-03-21

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

转载地址:http://fomgz.baihongyu.com/

你可能感兴趣的文章
Flask--简介
查看>>
Frame--Api框架
查看>>
Boostrap技能点整理之【网格系统】
查看>>
javaWeb服务详解(含源代码,测试通过,注释) ——Emp的Dao层
查看>>
Git简单理解与使用
查看>>
echarts 基本图表开发小结
查看>>
adb通过USB或wifi连接手机
查看>>
JDK9-15新特性
查看>>
TreeSet、TreeMap
查看>>
JVM内存模型
查看>>
可变长度参数
查看>>
3、条件查询
查看>>
cordova打包apk更改图标
查看>>
GitHub上传时,项目在已有文档时直接push出现错误解决方案
查看>>
文件系统的层次结构
查看>>
vue(渐进式前端框架)
查看>>
vscode设置eslint保存文件时自动修复eslint错误
查看>>
Remove Extra one 维护前缀最大最小值
查看>>
Linux操作系统的安装与使用
查看>>
C++ 继承 详解
查看>>