Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Makefile 如果需要,如何创建目录?_Makefile - Fatal编程技术网

Makefile 如果需要,如何创建目录?

Makefile 如果需要,如何创建目录?,makefile,Makefile,我试图使用makefile,我的问题是我有一个目录,有一个src目录和一个makefile。我还使用一个tmp目录来创建我必须创建的内容。 它包含对象文件。为了提高性能,我在调试时尽量不删除这些。 如果我为tmp创建一个规则来创建它,它总是重建所有的C文件。 那么如何做到这一点呢?有很多方法。这取决于您使用的make版本以及您使用的操作系统 您永远不能做的一件事是使用目录作为简单的先决条件。文件系统用于更新目录上修改时间的规则与make不兼容 对于POSIX系统上的simplemake,您可以在

我试图使用makefile,我的问题是我有一个目录,有一个
src
目录和一个
makefile
。我还使用一个
tmp
目录来创建我必须创建的内容。 它包含对象文件。为了提高性能,我在调试时尽量不删除这些。 如果我为tmp创建一个规则来创建它,它总是重建所有的C文件。
那么如何做到这一点呢?

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

您永远不能做的一件事是使用目录作为简单的先决条件。文件系统用于更新目录上修改时间的规则与
make
不兼容

对于POSIX系统上的simple
make
,您可以在规则中预先创建目录以执行编译:

obj/foo.o: foo.c
        @ mdkir -p obj
        $(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<
该方法简单、快速、可靠。它唯一的缺点是,即使不需要,也会始终创建目录。然而,这是我通常的做法

如果您有一个足够新的GNU make,最奇特的方法是使用仅限订单的先决条件:

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

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

这迫使
obj
目标在
obj/foo.o
目标之前构建,但在确定
obj/foo.o
是否过期时,
obj
上的时间戳将被忽略。

是否有可能重复的方法,而无需GNU进行扩展?(问题被标记为
Makefile
,而不是
GNUmakefile
)。不,在编写与POSIX兼容的Makefile时,无法将目录作为先决条件(使其行为符合要求)。您唯一能做的就是重写所有规则,以便在它们尝试使用可能不存在的目录之前添加显式的
mkdir-p
,而不是使用先决条件或制定规则来构建目录。
obj/foo.o: foo.c | obj
        $(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<

obj:
        mkdir -p $@