我的项目有混合源文件(由于第 3 方代码),所以我们有一些 .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'
最佳答案
您可以有多个规则来从不同的扩展构建目标。
例如,默认的 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++ makefile - 你如何处理混合源文件后缀的规则(例如.cpp和.cxx),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49556554/