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

How to compile multiple file types in the same way using 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 $< -MD -o $@

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

一般来说,不,你不能将它们结合起来。你有两个选择。第一种是使用 Amon Zilca 链接到的答案中的 eval 语句。

另一种方法是将配方保存在一个变量中并重新使用它:

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

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

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

个人比较喜欢这种方式; eval 方法对我来说太过分了,除非你有很多扩展,或者你想通过调整变量来轻松添加更多。

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