C++ GNU make中没有生成XXX错误的规则

C++ GNU make中没有生成XXX错误的规则,c++,makefile,C++,Makefile,我不熟悉Makefile。在尝试编写一个可以在我的大多数项目中使用且修改最少的通用Makefile时,我遇到了一个问题(简化如下): 我的“项目”看起来像: proj/ src1.cpp subdir1/ src2.cpp Makefile 生成文件的一部分: OBJ := bin/src1.o bin/subdir1/src2.o OBJ_DIR := bin/ bin/subdir1/ PROGRAMS := prog1 define compile

我不熟悉Makefile。在尝试编写一个可以在我的大多数项目中使用且修改最少的通用Makefile时,我遇到了一个问题(简化如下):

我的“项目”看起来像:

proj/
    src1.cpp
    subdir1/
        src2.cpp
    Makefile
生成文件的一部分

OBJ := bin/src1.o bin/subdir1/src2.o
OBJ_DIR := bin/ bin/subdir1/
PROGRAMS := prog1
define compile_template =
$(1)/%.o: %.cpp
    mkdir -p $$(@D)
    $$(CXX) $$(CXXFLAGS) -c $$< -o $$@
endef

define PROGRAM_template =
$(1): $$(OBJ)
    $$(CXX) $$(LDFLAGS) $$^ -o $$@ $$(LDLIBS)
endef

$(foreach odir,$(OBJ_DIR),$(eval $(call compile_template,$(odir))))
$(foreach prog,$(PROGRAMS),$(eval $(call PROGRAM_template,$(prog))))

另一个问题是,如果我只在特定机器上编译,我应该编写自己的Makefile还是使用automake等(这样我就可以控制编译器、操作系统等)

调试类似问题(eval问题)的最佳方法是用调用
$(info…
来替换
$(eval…
函数。这将打印出make正在解析的文本,通常很明显您的问题是什么。如果您将评估行改写为:

$(foreach odir,$(OBJ_DIR),$(info $(call compile_template,$(odir))))
$(foreach prog,$(PROGRAMS),$(info $(call PROGRAM_template,$(prog))))
(并修复明显的语法错误,即第一行中
=
之间的空格)您将看到:


调试此类问题(eval问题)的最佳方法是将
$(eval…
函数替换为调用
$(info…
)。这将打印出make正在解析的文本,通常很明显您的问题是什么。如果您将评估行改写为:

$(foreach odir,$(OBJ_DIR),$(info $(call compile_template,$(odir))))
$(foreach prog,$(PROGRAMS),$(info $(call PROGRAM_template,$(prog))))
(并修复明显的语法错误,即第一行中
=
之间的空格)您将看到:


这可能是一个愚蠢的答案,但您是否使用了制表符分隔符,不是吗?当我使用makefile时,这通常是我麻烦的根源(很久以前)。顺便说一下,试着使用cmake@Tom阿斯巴丹,我确实用过这个标签。cmake似乎是个不错的选择,谢谢你!这可能是一个愚蠢的答案,但您是否使用了制表符分隔符,不是吗?当我使用makefile时,这通常是我麻烦的根源(很久以前)。顺便说一下,试着使用cmake@Tom阿斯巴丹,我确实用过这个标签。cmake似乎是个不错的选择,谢谢你!非常感谢你!在你提到之前,我不知道函数
info
+1.非常感谢你!在你提到之前,我不知道函数
info
+1.
bin//%.o: %.cpp
        mkdir -p $(@D)
        $(CXX) $(CXXFLAGS) -c $< -o $@
bin/subdir1//%.o: %.cpp
        mkdir -p $(@D)
        $(CXX) $(CXXFLAGS) -c $< -o $@
prog1: $(OBJ)
        $(CXX) $(LDFLAGS) $^ -o $@ $(LDLIBS)
OBJ_DIR := bin bin/subdir1