将cpp文件从文件夹A编译到文件夹B时出现文件错误(没有规则要使MyApp需要目标xxx.o))

时间:2017-01-30 21:02:23

标签: makefile

我正在为一个小项目设置一个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)

1 个答案:

答案 0 :(得分:2)

因此,在您的makefile中,您将DEBUG_OBJ_FILES设置为没有任何路径的文件列表。因此,您的源文件为main.cppLogger/Logger.cpp,您的目标文件为build/debug/main.obuild/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

(默认情况下,它始终首先查看当前目录)。