Makefile 如果目标没有';不存在?
在我的makefile配置中,所有对象文件都被编译到一个特定的目录中。如果它不存在,编译器会进行投诉。我想创建一个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
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
。我希望这两个对象目标分别运行
当我用staticobj/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)
行基本上取自GNUmake-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