我试图用makefile编译一堆.cpp位于文件src/code/*.cpp,然后编译各*.o中build/,最后生成可执行文件那些build/为好.
我已经阅读了一些我尝试使用的答案,但遇到了我不理解的问题.
CC = g++
FLAGS = -g -c
SOURCEDIR = /src/code
BUILDDIR = build
EXECUTABLE = DesktopSpecificController
SOURCES = $(wildcard src/code/*.cpp)
OBJECTS = $(patsubst src/code/*.cpp,build/%.o,$(SOURCES))
all: dir $(BUILDDIR)/$(EXECUTABLE)
dir:
mkdir -p $(BUILDDIR)
$(BUILDDIR)/$(EXECUTABLE): $(OBJECTS)
$(CC) $^ -o $@
$(OBJECTS): $(BUILDDIR)/%.o : $(SOURCEDIR)/%.cpp
$(CC) $(FLAGS) $< -o $@
clean:
rm -f $(BUILDDIR)/*o $(BUILDDIR)/$(EXECUTABLE)
Run Code Online (Sandbox Code Playgroud)
我得到以下错误,我不知道为什么:
Makefile:19: target `src/code/main.cpp' doesn't match the target pattern
Run Code Online (Sandbox Code Playgroud)
我还看到,在尝试构建EXECUTABLE时,它没有使用.o文件,所以看来我的规则在这里是错误的.
Mad*_*ist 11
你的patsubst功能错了; 你不能使用shell通配符*.你要:
OBJECTS = $(patsubst $(SOURCEDIR)/%.cpp,$(BUILDDIR)/%.o,$(SOURCES))
Run Code Online (Sandbox Code Playgroud)
你也应该使用SOURCEDIR和BUILDDIR无处不在,不仅在某些地方(否则你会得到不一致).最后,您的SOURCEDIR值是错误的:它不应该以/我期望的开头:
SOURCEDIR = src/code
SOURCES = $(wildcard $(SOURCEDIR)/*.cpp)
Run Code Online (Sandbox Code Playgroud)