c++ - 编写一个 makefile 模板来处理多个 c++ 扩展

标签 c++ makefile

我正在尝试为给定的源文件列表编写一个处理多个 c++ 扩展的 makefile 模板,但不想为每个可能的扩展制定单独的规则。这可能吗?

例如

TMP_CPPEXTS := cpp c++
TMP_OBJDIR := ~/objfiles
TMP_SOURCEFILES := foo.cpp bar.c++
TMP_BASENAMES := $(basename $(TMP_SOURCEFILES))
TMP_OBJFILES := $(addprefix $(TMP_OBJDIR)/,$(addsuffix .o,$(notdir $(TMP_BASENAMES))))
TMP_DEPFILES :=$(addprefix $(TMP_OBJDIR)/,$(addsuffix .d,$(notdir $(TMP_BASENAMES))))

BD_EXTFROMBASE = $(strip $(foreach TMP_EXT,$(2),$(foreach TMP_NAME,$(1),$(if $(filter $(addsuffix .$(TMP_EXT),$(TMP_NAME)),$(TMP_SOURCEFILES)),$(EXT)))))

$(TMP_OBJFILES) : $(TMP_OBJDIR)/%.o : %.$(call BD_EXTFROMBASE,$*,$(TMP_CPPEXTS))
    g++ -c $< -o $@

$(TMP_DEPFILES) : $(TMP_OBJDIR)/%.d : %.$(call BD_EXTFROMBASE,$*,$(TMP_CPPEXTS))
    g++ -m $< -o $@

我已验证 TMP_OBJFILES 包含预期的目标文件,但似乎无法使规则本身起作用?除了使用单独的规则/宏之外还有什么建议吗?

最佳答案

这个怎么样:

define templ
$(TMP_OBJDIR)/%.o: %.$(1)
    g++ -c $$< -o $$@
endef

$(foreach ext,$(TMP_CPPEXTS),$(eval $(call templ,$(ext))))

关于c++ - 编写一个 makefile 模板来处理多个 c++ 扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18679617/

相关文章:

c++ - 获取 Linux 机器上所有连接的 IP

c++ - 错误地尝试重新安置引用的代码示例

c++ - dlopen 是否重新加载已经加载的依赖项?如果是这样,有什么影响?

c++ - Makefile:没有规则来制作目标。停止

c++ - gvim :make command does not work

c++ - 从抽象基类的多个部分实现继承?

用于固定大小矩阵和 vector 的 C++ 库

c - 我正在尝试在 Ubuntu 12.04.1 中进行系统调用。我在编译 hello.c 文件时遇到错误

makefile - GNU 使 "Removing intermediate files"

c - 通过结构不良的 makefile 系统定义多词