c++ makefile - 你如何处理混合源文件后缀的规则(例如 .cpp 和 .cxx)

Posted

技术标签:

【中文标题】c++ makefile - 你如何处理混合源文件后缀的规则(例如 .cpp 和 .cxx)【英文标题】:c++ makefile - how do you deal with rules for mixed source file suffixes (e.g. .cpp and .cxx) 【发布时间】:2018-03-29 12:50:08 【问题描述】:

我的项目有混合源文件(由于 3rd 方代码),所以我们有一些 .cpp 和一些 .cxx 文件。

继我之前的问题here 之后,我有以下生成文件:

# Folders
SRCDIR = src
OBJDIR = obj
SUBFOLDERS = test test/test2
OBJSUBFOLDERS = $(OBJDIR) $(addprefix $(OBJDIR)/, $(SUBFOLDERS))
SRCSUBFOLDERS = $(SRCDIR) $(addprefix $(SRCDIR)/, $(SUBFOLDERS))

# Just for me so I can read my own makefile :o
_TARGET = $@
_DEPEND = $<

# Get sources from /src and /src/test/ and /src/test/test2/
SOURCES = $(foreach dir, $(SRCSUBFOLDERS), $(wildcard $(dir)/*.cpp $(dir)/*.cxx))
# Source file without the /src at the start, then take the basename, then add .o, then add obj/ to the front
OBJECTS = $(addprefix $(OBJDIR)/, $(addsuffix .o, $(basename $(patsubst src/%, %, $(SOURCES)))))

# Main target 'make debug'
debug: debugging $(OBJECTS)
    @echo building: gcc $(OBJECTS) -o out.exe

# Compiling each file
$(OBJDIR)/%.o: $(SRCDIR)/%.cpp         <---- ISSUE HERE
    g++ -c $(_DEPEND) -o $(_TARGET)

debugging:
    @echo $(SOURCES)
    @echo $(OBJECTS)

所以我生成了源文件和目标文件的列表。对象是混合的 .cpp 和 .cxx。所以我的规则$(OBJDIR)/%.o: $(SRCDIR)/%.cpp 仅适用于 .cpp 文件。我试图让它$(OBJDIR)/%.o: $(SRCDIR)/%.c* 但这没有用。我怎样才能使这个规则通用来处理。还是有更好的办法?

如果我从 SOURCES = 中删除 $(dir)/*.cxx,那么这一切都有效,但仅适用于 .cpp 文件。

更新

这是我得到的输出:

SOURCES: src/main.cpp src/test/test.cpp src/test/test2.cxx
OBJECTS: obj/main.o obj/test/test.o obj/test/test2.o

Error: No rule to make target 'obj/test/test2.o', needed by 'debug'

【问题讨论】:

到底是什么问题?是不是无法获取.cxx文件? 只需添加第二条规则:$(OBJDIR)/%.o: $(SRCDIR)/%.cxx 规则。任务完成。 要么将所有 .cxx 文件重命名为 .cpp,要么使用单独的 makefile 将第 3 方部门构建到单独的库中,您将拥有 .cxx 的规则,然后只需链接到该库在你的项目中。 @Clearer 抱歉 - 我会添加错误...... 按照@SamVarshavchik 告诉你的去做。这应该可以解决问题。 【参考方案1】:

您可以有多个规则来从不同的扩展构建目标。

例如,默认的 Makefile 规则已经包含从 .c.cpp 构建 .o 的规则。 make 只是搜索第一个数学规则,使用后缀 listed for the .SUFFIXES target。

在您的情况下,您只需要两条规则:

$(OBJDIR)/%.o: $(SRCDIR)/%.cpp
    g++ -c $(_DEPEND) -o $(_TARGET)

$(OBJDIR)/%.o: $(SRCDIR)/%.cxx
    g++ -c $(_DEPEND) -o $(_TARGET)

【讨论】:

实际上你提出了另一点 - 如何处理 .c 文件,我想最简单的方法是添加另一条规则。我不太明白我是否可以让 .cpp 和 .c(作为一个已知的后缀)在一个规则中工作..? @igagis 但除了重命名文件之外,还有其他方法吗? 还可以通过使用这样的变量来减轻重复:COMPILE = g++ -c $(_DEPEND) -o $(_TARGET),然后对每个规则使用$(COMPILE)——这样我们只需要在一个地方编辑编译行 你会发现默认的makefile有.cpp.o.C.o等的重复规则......一些小的重复是不可避免的。 @code_fodder -- 你可以更进一步,在 makefile 中使用 definesevals (用于更长的食谱列表),但其中任何一个都会很快使代码不可读。如果您有非常复杂和重复的规则,这可能是合理的。另一种选择可能是执行%.cpp: %.cxx; ln -s $@ $^,但这可能会导致其他问题(清理、拉入所有 .cpp 文件的编辑器等)。

以上是关于c++ makefile - 你如何处理混合源文件后缀的规则(例如 .cpp 和 .cxx)的主要内容,如果未能解决你的问题,请参考以下文章

你如何处理不同的字符编码?

“老司机”教你如何处理PDF文件转换问题

你如何处理 Angular 中的函数顺序?

你如何处理 UIManagedDocument?

你如何处理 Internet Explorer?

你如何处理重复的街道后缀?