10

我正在尝试使用 makefile,我的问题是我有一个目录,有一个src目录和一个Makefile. 我还使用tmp我也必须创建的目录。它里面有目标文件。为了性能,我在调试时尽量不要删除这些。如果我为 tmp 创建一个规则来创建它,它总是会重建所有 C 文件。那么如何做到这一点呢?

4

1 回答 1

17

有很多方法。这取决于您使用的版本以及make您使用的操作系统。

您绝对不能做的一件事是使用目录作为简单的先决条件。文件系统用于更新目录上修改时间的规则不适用于make.

为了make在 POSIX 系统上简单,您可以在规则中预先创建目录来执行编译:

obj/foo.o: foo.c
        @ mdkir -p obj
        $(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<

如果你有 GNU make 你有两个选择。最简单的方法是在其他任何事情发生之前在读入 makefile 时强制创建目录,方法是添加如下一行:

_dummy := $(shell mkdir -p obj)

简单、快速、可靠。它唯一的缺点是该目录将始终被创建,即使它不是必需的。尽管如此,这是我通常这样做的方式。

如果你有一个足够新的 GNU make,最奇特的方法是使用 order-only 先决条件:

obj/foo.o: foo.c | obj
        $(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<

obj:
        mkdir -p $@

这会强制obj目标在目标之前构建obj/foo.oobj在确定是否过期时忽略obj/foo.o时间戳。

于 2013-05-02T19:37:01.687 回答