我正在尝试使用makefile,我的问题是我有一个目录,其中包含src
目录和Makefile
。我还使用了tmp
目录,这也是我必须创建的目录。
它具有目标文件。为了提高性能,我尝试在调试时不要删除它们。
如果我创建了一个tmp规则来创建它,它将始终重建所有C文件。
那么该怎么做呢?
最佳答案
有很多方法。这取决于您使用的make
版本和所使用的操作系统。
您永远不要做的一件事就是使用目录作为简单的先决条件。文件系统用于更新目录修改时间的规则不适用于make
。
对于POSIX系统上的简单make
,可以在规则中预先创建目录以执行编译:
obj/foo.o: foo.c
@ mdkir -p obj
$(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<
如果您拥有GNU,则有两种选择。最简单的方法是通过添加如下行,强制在读取makefile之前先创建目录,然后再进行其他操作:
_dummy := $(shell mkdir -p obj)
简单,快速,可靠。唯一的缺点是即使不需要目录,也将始终创建目录。不过,这是我通常这样做的方式。
如果您有足够新的GNU make,最理想的方法是使用仅订购的先决条件:
obj/foo.o: foo.c | obj
$(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<
obj:
mkdir -p $@
这会强制在
obj
目标之前构建obj/foo.o
目标,但是在确定obj
是否过期时会忽略obj/foo.o
的时间戳。
关于makefile - 如果需要,如何创建目录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16344719/