Makefile中静态模式规则和普通模式规则的区别

静态模式规则和普通模式规则都是一种使用%字符来匹配文件名的规则,但是它们有一些区别:

  • 静态模式规则需要在规则的第一行指定目标文件的列表,而普通模式规则不需要。
  • 静态模式规则可以指定多个目标模式,而普通模式规则只能指定一个目标模式。

静态模式规则和普通模式规则的区别有点细微,但是很重要。用一个类比的例子来帮助理解。

假设你有一些衣服需要洗,你可以选择用手洗或者用洗衣机洗。如果你用手洗,你需要对每一件衣服指定洗涤的方法,比如用什么水温,什么洗涤剂,什么力度等。这就相当于静态模式规则,你需要明确地指定目标(衣服)和方法(洗涤)。如果你用洗衣机洗,你只需要选择一个通用的模式,比如快速洗或者深度洗,然后把所有的衣服放进去。这就相当于普通模式规则,你不需要指定目标和方法,而是让洗衣机自动匹配。

但是,有些衣服可能不适合用洗衣机洗,比如羊毛衫或者丝绸裙。这时候,你就需要用手洗来覆盖洗衣机的模式,以免损坏衣服。这就相当于静态模式规则可以覆盖普通模式规则。而有些衣服可能没有特殊的要求,比如棉质T恤或者牛仔裤。这时候,你就可以放心地用洗衣机来洗,不需要额外的操作。这就相当于普通模式规则只能在没有找到其他匹配的规则时使用。

关于第一点:静态模式规则需要在规则的第一行指定目标文件的列表,是为了限制模式规则的作用范围,只对列表中的每个目标使用命令来编译它们。

关于第二点:静态模式规则可以指定多个目标模式,而普通模式规则只能指定一个目标模式。有如下例子:

假设你有一些图片文件需要压缩,你可以选择用不同的格式来保存压缩后的文件,比如.jpg或者.png。如果你使用静态模式规则,你可以一次性指定多个目标格式,比如:

%.jpg %.png: %.bmp
    convert $< -resize 50% $@

这个规则表示对于任何的.bmp文件,我们可以生成对应的.jpg和.png文件,并且使用convert命令来压缩它们。这里,我们指定了两个目标模式%.jpg和%.png,所以这个规则可以匹配foo.jpg, foo.png, bar.jpg, bar.png等文件。

但是,如果我们使用普通模式规则,我们只能指定一个目标格式,比如:

%.jpg: %.bmp
    convert $< -resize 50% $@

这个规则只能匹配%.jpg文件,所以只能生成foo.jpg, bar.jpg等文件,而不能生成%.png文件。如果我们想要生成%.png文件,我们需要再写一个普通模式规则:

%.png: %.bmp
    convert $< -resize 50% $@

这样,我们就需要写两个普通模式规则来实现和一个静态模式规则相同的功能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值