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 中使用 defines
和 evals
(用于更长的食谱列表),但其中任何一个都会很快使代码不可读。如果您有非常复杂和重复的规则,这可能是合理的。另一种选择可能是执行%.cpp: %.cxx; ln -s $@ $^
,但这可能会导致其他问题(清理、拉入所有 .cpp 文件的编辑器等)。以上是关于c++ makefile - 你如何处理混合源文件后缀的规则(例如 .cpp 和 .cxx)的主要内容,如果未能解决你的问题,请参考以下文章