Makefile混淆虚假黑客

时间:2017-01-29 14:19:45

标签: c makefile

文件夹结构:

  • 生成文件
  • rect_01.c
  • rect_02.c
  • square_01.c

Makefile(相关部分):

22.222223

命令:

%.c:
    echo 'Building $@ for $(PLATFORM)...'
    $(CC) $(CFLAGS) $@ -o '$(DESTDIR)/$*'

问题 - 给了我输出:

make rect_01.c PLATFORM=FOO

所以我尝试了一个hack并添加了一个依赖项,我添加到.Phony, 这样每次都应该执行%.c。但现在它试图编译我的 makefile即使它没有扩展名.c。

我写了以下更新的makefile(相关部分):

'rect_01.c up already to date'

这给了我以下输出:

.PHONY: phonyDummy

%.c: phonyDummy
    echo 'Building $@ for $(PLATFORM)...'
    $(CC) $(CFLAGS) $@ -o '$(DESTDIR)/$*'

你能解释一下这种行为吗?

1 个答案:

答案 0 :(得分:0)

您应该了解有关Makefile的更多信息。你混合了两件重要的事情:目标和依赖。

目标是应该使用规则创建的文件(在大多数情况下)。依赖性是"来源"。

如果你写:

%.c:
    echo 'Building $@ for $(PLATFORM)...'
    $(CC) $(CFLAGS) $@ -o '$(DESTDIR)/$*'

表示:"我想创建.c扩展名为"的文件。您不想创建.c个文件,因为您有很多(三个).c个文件。 make检查rect_01.c:它是否存在且是最新的,因为它没有任何依赖关系(:之后没有依赖关系任何东西)。

我认为您要构建rect_01.so(或类似) - 这是目标!所以你想要类似的:

%.o: %.c
    echo 'Building $@ for $(PLATFORM)...'
    $(CC) $(CFLAGS) -o $@ $<

在这种情况下,如果您要构建rect_01.o,则应运行make rect_01.o。如果$(CC)不存在或早于rect_01.o,则rect_01.c将会运行(因此来源rect_01.c较新且尚未重建)。< / p>