我目前正试图让我的 makefile 独立于我的文件夹结构。到目前为止,我使用的是一个包含所有 .cpp 文件的特定文件夹。我的 .o 文件都放在一个单独的 OBJ/文件夹中。但是,我现在希望我的 makefile 自动从所有子目录中获取所有 .cpp 文件(如果可能,任何深度),但仍然将所有 .o 文件放在同一个 OBJ 文件夹中。这是我的 makefile 目前的样子:
CC = g++ -g
SRC = Src/
OBJ = Obj/
BIN = Bin/
INC = -I Lib/GLFW/include/\
-I Lib/GLAD/include/\
-I Lib/STB/\
-I Lib/GLM/\
-I Src/Header/
LIB = -L Lib/GLFW/lib-mingw-w64 -lglfw3 -lopengl32 -lglu32 -lgdi32
EXE = $(BIN)Test.exe
SOURCEFILES = $(wildcard $(SRC)**/*.cpp)
OBJECTFILES = $(patsubst $(SRC)%.cpp,$(OBJ)%.o,$(SOURCEFILES))
all: $(SOURCEFILES) $(EXE)
$(EXE) : $(OBJECTFILES)
$(CC) -o $@ $^ $(LIB)
$(OBJ)%.o: $(SRC)%.cpp
$(CC) -c $< $(INC) -o $@
它有点像我想要的,但出于某种原因,它目前需要在 OBJ/中具有与我的 SRC/目录相同的文件夹结构:如果我的 .cpp 文件是 SRC/foldername/name.cpp 我的 makefile 想要将 .o 创建为 OBJ/foldername/name.o。我希望所有文件的 OBJ/name.o 无论 SRC/的结构如何。我需要改变什么才能实现这一点?
我的第二个问题是关于包含路径。从 makefile 中可以看出,我所有的头文件都在一个目录 Src/Header/ 中。是否有可能以某种方式自动从 Src/及其子目录中获取并链接正确的 .h 文件?
最佳答案
如果你想扁平化路径,你可以使用notdir
.
不幸的是,因为 %.o
是“魔法”,您不能将它包装在 $(notdir)
中。
顺便说一下,作为一种风格,我会在这些变量中去掉尾部的斜杠,而是在表达式中使用它;它会更容易阅读,也更灵活。
这对我有用:
SRC=srcPath
OBJ=objPath
SOURCEFILES = $(wildcard $(SRC)/**/*.cpp)
OBJECTFILES = $(addprefix $(OBJ)/, $(notdir $(patsubst $(SRC)/%.cpp, %.o, $(SOURCEFILES))))
all:
echo $(OBJECTFILES)
确实存在更令人满意的替代方案,但重点是您可以使用 notdir
来构建您的解决方案。
关于c++ - makefile 中的 patsubst 不会替换完整的文件路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54110071/