通用makefile显示没有规则来产生目标错误

时间:2016-04-05 07:06:18

标签: c++ c makefile

我写了一个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它会给出错误:

  

制作:*** bin/debug/ssb_main.o不需要制作目标main.out的规则。停止。

3 个答案:

答案 0 :(得分:1)

在编译规则中,您已指定源文件位于&#39; src&#39;目录。但是根据你的描述,似乎ssb_main.cpp文件位于&s; src / DBEngine / benchmark / ssb /&#39;文件夹,因此 make 找不到编译ssb_main.o的依赖项。

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

答案 1 :(得分: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 :(得分:0)

由于您的子文件夹是您的src文件夹,您可以尝试使用

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

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