如何编译多个子目录中的所有cpp文件?

时间:2017-10-02 00:16:59

标签: c++ macos makefile

目前,我有一个makefile设置,我在一个目录src中编译所有cpp文件。它的结构如下

CCPP = g++
CPPFLAGS =  -std=c++11
CPPLINK = -lstdc++
INC_DIR = include

CPP_FILES := $(wildcard src/*.cpp)
OBJ_FILES := $(addprefix lib/,$(notdir $(CPP_FILES:.cpp=.o)))
LD_FLAGS :=
CC_FLAGS := -c $(CPPFLAGS) -Wall -I$(INC_DIR)

bin/Xenon: $(OBJ_FILES) ; $(CCPP) $(LD_FLAGS) -o $@ $^

lib/%.o: src/%.cpp ; $(CCPP) $(CC_FLAGS) -c -o $@ $<

然而,虽然这有效,但我想将src分成cpp文件的多个子目录。

如何使此解决方案适用于单个src文件夹下的任意数量的子目录?

注意:此处bin/Xenon是一个带有main方法的CLI应用程序,INC_DIR是我所有头文件所在的位置。这也是OSX,而​​不是Windows。

1 个答案:

答案 0 :(得分:2)

简单的部分是

CPP_FILES := $(wildcard src/*/*.cpp)   # if all are in subdirectories
CPP_FILES := $(wildcard src/*.cpp src/*/*.cpp)
OBJ_FILES := $(patsubst src/%,lib/%,$(CPP_FILES:.cpp=.o))

如果您在多个目录中拥有相同的文件名,则不希望$(notdir)

您还必须担心制作lib的相应子目录。最简单的方法可能是在写入时确保每个都存在:

lib/%.o: src/%.cpp
    mkdir -p $(dir $@)
    $(CCPP) $(CC_FLAGS) -c -o $@ $<