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

标签 c++ makefile

我的项目有混合源文件(由于第 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/

相关文章:

c++ - 使用 std::chrono 两个日期之间还剩多少天

c++创建具有数组作为成员的对象

c++ - 为什么 std::async 比简单的分离线程慢?

dependencies - 当依赖项列表更改时重新链接 Makefile 目标

c - 如何从 C 程序创建 makefile?

c++ - 共享对象中命名不兼容的符号 - 在哪里查找问题

c++ - 如何将本地端点绑定(bind)到套接字?

c++ - 在 Makefile 中解决依赖关系的常用方法是什么?

c++ - 将旧的 makefile 转换为 CMake

c++ - 使用具有多重继承的 Qt 信号和槽