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$@)
。的可能重复项