Makefile 如果目标没有';不存在?

Makefile 如果目标没有';不存在?,makefile,gnu-make,Makefile,Gnu Make,在我的makefile配置中,所有对象文件都被编译到一个特定的目录中。如果它不存在,编译器会进行投诉。我想创建一个makefile目标,该目标识别任何对象文件,并在任何其他目标运行和实际编译对象文件之前创建该目录 到目前为止,我已经尝试了模式匹配和双冒号规则 obj: mkdir obj obj/%.o :: | obj obj/example.o :: src/example.cc includes/example.hh $(build_obj_file) # macro

在我的makefile配置中,所有对象文件都被编译到一个特定的目录中。如果它不存在,编译器会进行投诉。我想创建一个makefile目标,该目标识别任何对象文件,并在任何其他目标运行和实际编译对象文件之前创建该目录

到目前为止,我已经尝试了模式匹配和双冒号规则

obj: 
    mkdir obj

obj/%.o :: | obj

obj/example.o :: src/example.cc includes/example.hh
    $(build_obj_file) # macro to do the actual job
使用此代码,只有最后一个目标运行于
obj/example.o
。我希望这两个对象目标分别运行

当我用static
obj/example.o
替换模式匹配时,我得到了期望的结果。当我使用静态模式匹配时,比如
obj/example.o:obj/%.o::obj

我真的不想将
obj
作为每个其他对象文件的附加依赖项,也不想为静态模式匹配创建所有对象文件的单独列表。任何一种方法都非常脆弱,而且容易出错


您建议如何解决这样的任务?

您不能使用模式规则向一组目标“添加额外的先决条件”。模式规则必须提供一个配方;如果他们没有,那么他们被认为是

因为您提供的真正的makefile太少,所以很难提出一个适合您的解决方案

如果要使用仅限订单的先决条件,则需要将它们添加到与目标匹配的模式规则中:

obj/%.o : src/%.cc | obj
         $(build_obj_file)
或者单独定义先决条件关系:

obj/example.o: | obj
使用(GNU)make和易于理解的规则,或多或少改编自automake生成的规则集:

MKDIR_P = mkdir -p

obj/%.o: src/%.cc
    @$(MKDIR_P) $(@D)
    $(COMPILE.cc) -o $@ -c $<

obj/example.o : includes/example.hh
|obj
部分将确保目标对象文件不会仅仅因为有人在
obj/
中添加或删除了文件,从而更改了
obj
目录的时间戳而重建

$(COMPILE.cc)
行基本上取自GNU
make-p
的输出

请注意,手动维护标头依赖关系非常容易出错,因此这应该是自动生成的,最好是由的自动生成

此外,如果您的代码> MaxFrase<代码>使用GnuMeMy,考虑重命名它<代码> GuuMaMeCuff> />代码>


使用automake,您无法将目标文件放在特定目录下进行编译,但是这个问题的
automake
标记似乎是一个错误。

实际上,这是我的整个makefile:D。这只是一个调查这个问题的实验(尽管它似乎最终按照预期工作).FTR:为什么这个标签上有
automake
?@ndim对不起,这似乎是个错误。我纠正了它。
MKDIR_P = mkdir -p

obj:
    @$(MKDIR_P) $@

obj/%.o: src/%.cc | obj
    $(COMPILE.cc) -o $@ -c $<

obj/example.o : includes/example.hh