c++ - 如何使用 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 $< -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 $@)

关于c++ - 如何使用 Make 以相同的方式编译多种文件类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30706600/

相关文章:

bash - Makefile 任务因错误而停止,我可以继续运行它吗?

gnu-make - 如何在 Gnu Make 文件中全局运行一些命令

c++ - GCC 构建时间并没有从预编译的头文件中获得太多好处

ubuntu - gnumake 的奇怪重定向问题

c++ - 错误 : no operand "<<" matches these operands when try to use Qstring with OStream object

c++ - 在具有专门化程序的模板类上正确使用 const 返回值

c++ - 派生模板类访问基类成员数据

c -/usr/bin/ld : cannot find -lhogweed

shell - 在 ubuntu 中阻止命令(在 shell 中)

c++ - 如何绘制近似于原始曲线的曲线