我正在尝试使用makefile,我的问题是我有一个目录,src
目录和Makefile
。我还使用了tmp
目录,我也必须创建它。
它有目标文件。为了性能,我尝试在调试时不删除它们。
如果我为tmp创建一个规则来创建它,它总是会重建所有C文件。
那怎么做呢?
答案 0 :(得分:9)
有很多方法。这取决于您使用的make
版本以及您正在使用的操作系统。
您必须做的一件事是使用目录作为简单的先决条件。文件系统用于更新目录上修改时间的规则与make
不兼容。
对于POSIX系统上的简单make
,您可以在规则中预先创建目录以执行编译:
obj/foo.o: foo.c
@ mdkir -p obj
$(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<
如果你有GNU make,你有两个选择。最简单的方法就是在通过添加如下所示的行之前,在读取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
上的时间戳已经过时了。