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

标签 c++ makefile

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

相关文章:

c++ - 为什么我不能在我的程序中使用 "file_ptr>>variable"从文件中读取?

c++:复制ctor和指针

c++ - 如何从 MFC 中的线程更改状态栏的 Pane 文本?

makefile - 获取包含在 Makefile 中的文件的路径

c++ - 如何使用 __attribute__((visibility ("default")))?

c++ - 我的程序中是否存在计算错误?

c++ - Linux C++ 读取 UART 设备工作不一致

makefile - 如何在 make 变量中将当前目录捕获为绝对路径名?

visual-c++ - 每个 .exe 文件都需要在 Microsoft Visual C++ 中创建一个新项目吗?

创建编译多个 C 文件以在 Minix 中使用的 Makefile