一般生成文件显示没有规则来生成目标错误

Generic makefile showing no rule to make target error

本文关键字:目标 错误 有规则 显示 文件      更新时间:2023-10-16

我编写了一个makefile来编译和链接项目中的所有文件。现在我只有两个cpp文件:src/main.cppsrc/DBEngine/benchmark/ssb/ssb_main.cpp

我的makefile内容是:

CPP_FILES := $(wildcard src/*.cpp) $(wildcard src/DBEngine/benchmark/ssb/*.cpp) 
OBJ_FILES := $(addprefix bin/obj/,$(notdir $(CPP_FILES:.cpp=.o)))
DEBUG_OBJ_FILES := $(addprefix bin/debug/,$(notdir $(CPP_FILES:.cpp=.o)))
CC_FLAGS := -I${PWD}
main.out: $(OBJ_FILES)
    g++ -o $@ $(OBJ_FILES)
bin/obj/%.o: src/%.cpp
g++ -c -o $@ $< (CC_FLAGS) -w

但当我做一个make时,它会给出错误:

make:***没有使目标bin/debug/ssb_main.o成为main.out所需的规则。停止

简短版本:对于DBEngine 中的对象文件,您的模式规则展开如下

bin/obj/ssb_main.o: src/ssb_main.cpp

我敢肯定,你可以看到这是行不通的。

你可以添加另一个模式规则来修复它

bin/obj/%.o: src/DBEngine/benchmark/ssb/%.cpp
    g++ -c -o $@ $< $(CC_FLAGS) -w

然而,一个更简单的方法是镜像源代码并构建树,并使用vpath,确保makefile目录中也有一个名为DBEngine/benchmark/ssb的目录,并使用以下内容:

CPP_FILES := $(wildcard src/*.cpp) $(wildcard src/DBEngine/benchmark/ssb/*.cpp) 
OBJ_FILES := $(CPP_FILES:src/%.cpp=%.o)
CPPFLAGS  := -I${PWD}
CXXFLAGS  := -w
vpath %.cpp src
main: $(OBJ_FILES)

内置规则将处理其余部分。

旁注:-I${PWD}是多余的,而-w通常是个坏主意。

在编译规则中,您已指定源文件位于"src"目录中。但从您的描述来看,ssb_main.cpp文件似乎位于"src/DBEngine/backment/ssb/"文件夹中,因此make找不到编译ssb_main.o的依赖项。

您可以使用变量VPATH来指定make应该在其中查找源文件的文件夹。

由于子文件夹是src文件夹,因此可以尝试使用

CPP_FILES := $(shell ls -pR ./src | grep -v /)

它将列出src下的所有cpp文件及其子文件夹(不包括)。和