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

How to compile multiple file types in the same way using Make

本文关键字:编译 文件 类型 方式 Make 何使用      更新时间:2023-10-16

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 $@

看到它们非常相似(只有文件扩展名不同),我可以合并它们以某种方式为两种文件类型创建一个通用目标吗?

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

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

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 $@)