【问题标题】:Understanding Make's implicit rules理解 Make 的隐含规则
【发布时间】:2010-09-21 04:08:50
【问题描述】:

如果我从这个文件中删除 gcc 行,它不应该将编译作为隐含规则吗?为什么不允许我使用该 makefile 配置运行程序 ./calc

生成文件:

all: calc 

clean:  
    rm -rf calc arit.o calc.o

calc:   calc.o arit.o
    #gcc -o calc calc.o arit.o

calc.o: calc.c arit.h
    #gcc -c calc.c 

arit.o: arit.c arit.h
    #gcc -c arit.c

【问题讨论】:

    标签: makefile


    【解决方案1】:

    因为注释是由制表位缩进的,所以它被视为命令(并由 shell 执行,shell 将其视为注释)。

    如果 '#' 符号在第 1 列中,那么它们将是纯 (make) cmets。

    【讨论】:

      【解决方案2】:

      除了 Jonathan Leffler 的回答之外,以下最小的 GNUMakefile 应该只通过隐式规则进行所有编译和链接:

      calc: calc.o arit.o
      arit.o: arit.c arit.h
      calc.o: calc.c arit.h
      clean:
          rm -rf calc arit.o calc.o
      

      【讨论】:

      • 有趣:我不知道你可以用 GNU Make 省略链接行命令。有一些版本的 Make 是不可能的——例如,Solaris make,我相信 POSIX make 不能保证这一点。
      • @Jonathan Leffler:gnu.org/software/make/manual/make.html#Catalogue-of-Rules 并未将其列为非 POSIX 功能(查找“链接单个对象文件”)。我从 heirloom 项目中构建了make 并对其进行了测试,它还链接了两个对象,所以我猜它是相当可移植的。
      • 定义“合理便携”。它不适用于 Solaris 10 品牌。它不适用于 HP-UX 11.11 版本。它不适用于 AIX 5.3 版本。这使得都使用 GNU make 的 Linux 和 MacOS X 成为它工作的系统。 YMMV。我注意到手册说“这条规则对于只有一个源文件的简单程序是正确的。如果有多个目标文件(可能来自其他各种源文件),它也会做正确的事情,其中​​一个有与可执行文件的名称匹配的名称。”这不再是“链接单个对象文件”。
      • FWIW:在 HP-UX 和 Solaris 上,make 不会尝试运行链接命令;在 AIX 上,make 运行单对象链接命令 ('cc -O calc.c -o calc')。
      • @Jonathan Leffler:Touché。我的直觉是把传家宝作为严格遵守标准的代表,结果证明这是不正确的。
      猜你喜欢
      • 2017-09-26
      • 2017-11-11
      • 1970-01-01
      • 2011-04-23
      • 2011-07-25
      • 2012-01-28
      • 1970-01-01
      • 1970-01-01
      • 2013-06-13
      相关资源
      最近更新 更多