C++ 如何使用Make以相同的方式编译多个文件类型

C++ 如何使用Make以相同的方式编译多个文件类型,c++,makefile,gnu-make,C++,Makefile,Gnu Make,在Makefile中,我有以下两个半通用目标来处理任何.cc和.cpp文件的编译: $(OBJ_DIR)/%.o: %.cc mkdir -p $(dir $@) $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(INCDIRS) -c $< -MD -o $@ $(OBJ_DIR)/%.o: %.cpp mkdir -p $(dir $@) $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(INCDIRS) -c $<

Makefile
中,我有以下两个半通用目标来处理任何
.cc
.cpp
文件的编译:

$(OBJ_DIR)/%.o: %.cc
    mkdir -p $(dir $@)
    $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(INCDIRS) -c $< -MD -o $@

$(OBJ_DIR)/%.o: %.cpp
    mkdir -p $(dir $@)
    $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(INCDIRS) -c $< -MD -o $@
$(OBJ_DIR)/%.o:%.cc
mkdir-p$(dir$@)
$(CXX)$(CPPFLAGS)$(CxFlags)$(INCDIRS)-c$<-MD-o$@
$(对象目录)/%.o:%.cpp
mkdir-p$(dir$@)
$(CXX)$(CPPFLAGS)$(CxFlags)$(INCDIRS)-c$<-MD-o$@

鉴于它们非常相似(只是文件扩展名不同),我是否可以合并它们以为这两种文件类型创建一个通用目标?

一般来说,不能合并它们。你有两个选择。第一种方法是使用
eval
语句,如阿蒙·齐尔卡链接的答案中所述

另一种方法是将配方保存在变量中,然后重复使用:

define COMPILE
  mkdir -p $(dir $@)
  $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(INCDIRS) -c $< -MD -o $@
endef

$(OBJ_DIR)/%.o: %.cc
        $(COMPILE)

$(OBJ_DIR)/%.o: %.cpp
        $(COMPILE)
定义编译
mkdir-p$(dir$@)
$(CXX)$(CPPFLAGS)$(CxFlags)$(INCDIRS)-c$<-MD-o$@
恩德夫
$(OBJ_DIR)/%.o:%.cc
$(编译)
$(对象目录)/%.o:%.cpp
$(编译)
我个人更喜欢这种方法;对我来说,
eval
方法感觉像是杀伤力过大,除非你有很多扩展,或者你想简单地通过调整一个变量来添加更多

哦,请注意,您也可以使用
$(@D)
而不是
$(dir$@)

的可能重复项