gpt4 book ai didi

c++ - makefile 中的 patsubst 不会替换完整的文件路径

转载 作者:行者123 更新时间:2023-11-30 04:52:50 25 4
gpt4 key购买 nike

我目前正试图让我的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com