我写了一个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它会给出错误:
制作:***
bin/debug/ssb_main.o
不需要制作目标main.out
的规则。停止。
答案 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文件及其子文件夹(不包括)。和.. ..