通用生成文件显示没有生成目标错误的规则
Posted
技术标签:
【中文标题】通用生成文件显示没有生成目标错误的规则【英文标题】:Generic makefile showing no rule to make target error 【发布时间】:2016-04-05 07:06:18 【问题描述】:我编写了一个 makefile 来编译和链接我项目中的所有文件。现在我只有 2 个 cpp 文件:src/main.cpp
和 src/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
需要。停下来。
【问题讨论】:
【参考方案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 文件夹和子文件夹中的所有文件以上是关于通用生成文件显示没有生成目标错误的规则的主要内容,如果未能解决你的问题,请参考以下文章