我正在为一个小项目设置一个makefile,并试图让它将所有对象和二进制文件构建到一个输出文件夹。尝试从包含make文件的文件夹以外的任何位置编译cpp文件时似乎存在问题。
目前我有以下文件:
的main.cpp
HelloWorld.cpp
记录器/ Logger.cpp
这是我的makefile中的调试构建规则:
#
# Debug rule
#
debug: $(DEBUG_BINARY)
$(DEBUG_BINARY): $(DEBUG_OBJ_FILES)
$(CXX) $(CFLAGS) $(DEBUG_CFLAGS) -o $(DEBUG_BINARY) $^
$(DEBUG_BUILD_DIR)/%.o: %.cpp
$(CXX) -c $(CFLAGS) $(DEBUG_CFLAGS) -o $@ $<
我正在尝试编译到以下文件夹:
构建/调试/
但这是我得到的输出:
g ++ -c -I。 -DDEBUG -g -o build / debug / HelloWorld.o HelloWorld.cpp
g ++ -c -I。 -DDEBUG -g -o build / debug / main.o main.cpp
制作:***没有规则要制作目标&#39; build / debug / Logger.o&#39;,需要&#39; build / debug / MyApp&#39;。停止。
编辑:
如果我明确地为Logger.cpp文件添加一个规则,它编译得很好,大概是因为使用%模式匹配符号的最后一行只为当前目录中的所有cpp文件创建了构建规则,所以我该如何修改该规则包括所有子目录?
以下是我最着名的变数:
SRC_FILES = $(wildcard *.cpp) \
$(wildcard Logger/*.cpp)
OBJ_FILES = $(SRC_FILES:.cpp=.o)
DEP_FILES = $(OBJ_FILES:.o=.d)
DEBUG_BUILD_DIR = $(BUILD_PREFIX)/debug
DEBUG_BINARY = $(DEBUG_BUILD_DIR)/$(BINARY_NAME)
DEBUG_CFLAGS = -DDEBUG -g
DEBUG_OBJ_FILES = $(addprefix $(DEBUG_BUILD_DIR)/, $(notdir $(OBJ_FILES)))
最后一行(DEBUG_OBJ_FILES)将每个cpp文件路径转换为输出文件夹(例如,Logger / Logger.cpp变为build / debug / Logger.o)
答案 0 :(得分:2)
因此,在您的makefile中,您将DEBUG_OBJ_FILES
设置为没有任何路径的文件列表。因此,您的源文件为main.cpp
和Logger/Logger.cpp
,您的目标文件为build/debug/main.o
和build/debug/Logger.o
。
您的模式规则是:
$(DEBUG_BUILD_DIR)/%.o : %.cpp
因此,当make想要构建build/debug/Logger.o
时,模式%
会匹配什么?它匹配Logger
。因此,您已经定义了可以从build/debug/Logger.o
构建Logger.cpp
的规则,但您的代码库中没有Logger.cpp
,您只有Logger/Logger.cpp
}。但是,make并不知道如何从中构建。
一种选择是为此定义新的模式规则:
$(DEBUG_BUILD_DIR)/%.o : Logger/%.cpp
...
再次为每个子目录。这将有效。
另一个选择是使用GNU make&#39; VPATH facility来制作搜索源文件的路径列表:
VPATH := Logger
(默认情况下,它始终首先查看当前目录)。