通用生成文件显示没有生成目标错误的规则

Posted

技术标签:

【中文标题】通用生成文件显示没有生成目标错误的规则【英文标题】:Generic makefile showing no rule to make target error 【发布时间】:2016-04-05 07:06:18 【问题描述】:

我编写了一个 makefile 来编译和链接我项目中的所有文件。现在我只有 2 个 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.omain.out 需要。停下来。

【问题讨论】:

【参考方案1】:

短版:您的模式规则针对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 通常是个坏主意。

【讨论】:

非常感谢您的详细回答。【参考方案2】:

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

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

【讨论】:

【参考方案3】:

因为你有子文件夹是你的 src 文件夹,你可以尝试使用

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

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

【讨论】:

您好,ls -A -R src/*.cpp 找不到 src/DBEngine/benchmark/ssb/ssb_main.cpp 文件 我稍微修改了 ls 命令。它现在应该列出 src 文件夹和子文件夹中的所有文件

以上是关于通用生成文件显示没有生成目标错误的规则的主要内容,如果未能解决你的问题,请参考以下文章

没有扩展名的目标的自动生成默认规则?

gcc makefile错误:“没有规则来制作目标......”

驱动程序未编译“没有规则来制作目标”

我们如何生成 MCE(机器检查错误)

GNU autotool:没有规则来制定目标

多个子目录中目标文件的通用生成文件目标