我正在尝试使用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)
我收到以下错误,我不确定原因:
Makefile:19: target `src/code/main.cpp' doesn't match the target pattern
我也看到在尝试构建EXECUTABLE时,它没有使用.o文件,所以看来我的规则在这里是错误的。
答案 0 :(得分:11)
您的patsubst
功能错误;你不能使用像*
这样的shell通配符。你想要:
OBJECTS = $(patsubst $(SOURCEDIR)/%.cpp,$(BUILDDIR)/%.o,$(SOURCES))
此外,您应该在任何地方使用SOURCEDIR
和BUILDDIR
,而不仅仅是在某些地方(否则您会遇到不一致)。最后,您的SOURCEDIR值是错误的:它不应该以我期望的/
开头:
SOURCEDIR = src/code
SOURCES = $(wildcard $(SOURCEDIR)/*.cpp)