Makefile – 规则

Mafile通过定义规则告诉make怎么编译生成目标文件,规则的一般格式是:

目标 [目标 ...] : [依赖 ...]
[   命令 ...]

如上所示,输出是目标,输入是依赖项。要生成输出,在命令行中,执行make 目标 [目标 ...]。如果依赖项比目标文件更新或目标文件不存在,那么执行配置的[ 命令 ...]输出目标,否则不执行。

方括号中的参数是可选的,省略号表示允许多个参数。所配置的每一行命令前面都必须空一个Tab键。

示例:

hello: main.o factorial.o hello.o
    $(CC) main.o factorial.o hello.o -o hello

上面例子中,目标是hello,依赖项是main.o factorial.o hello.o,定义了一个命令:$(CC) main.o factorial.o hello.o -o hello,该命令根据依赖项生成目标文件。

生成目标文件,在命令行中执行:make hello,make检查依赖项是否比目标更新,是则执行$(CC) main.o factorial.o hello.o -o hello,否则不执行。

如果必须生成依赖项(也是某条规则的目标),则首先生成依赖项,以此类推,递归方式生成。

如果任何命令返回失败,那么make会终止执行。

在命令前加-可忽略返回状态,无论返回什么,make都将继续执行:

clean:
   -rm *.o *~ aaa

Makefile中,每执行一条命令都会把执行的命令打印出来,可以在命令前加@关闭打印:

install:
   @echo 按任何键继续...

按照Unix系统传统,有些目标已经形成惯例,基本上所有的Makefile都应该包含这些目标:

  • make all – 全部编译
  • make install – 把编译好的程序安装到正确位置
  • make clean – 清理编译产生目标文件、中间文件等

Makefile 隐式规则

“隐式规则”是一种惯例,make按照这种“惯例”运行,不需要在Makefile里详细写明。

例如,把[xxx.c/xxx.cpp]文件编译成[xxx.o]文件这一规则就是“隐式规则”,make会自动推导出这种规则,生成[xxx.o]文件。

在下面的例子中,无需为main.o factorial.o hello.o指定规则,make会自动根据隐式规则,把对应的cpp/c源文件编译为.o文件。

hello: main.o factorial.o hello.o
    $(CC) main.o factorial.o hello.o -o hello


浙ICP备17015664号 浙公网安备 33011002012336号 联系我们 网站地图  
@2019 qikegu.com 版权所有,禁止转载