Makefile:从目录编译到另一个目录

时间:2013-06-04 17:52:00

标签: makefile

我正在尝试使用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文件,所以看来我的规则在这里是错误的。

1 个答案:

答案 0 :(得分:11)

您的patsubst功能错误;你不能使用像*这样的shell通配符。你想要:

OBJECTS = $(patsubst $(SOURCEDIR)/%.cpp,$(BUILDDIR)/%.o,$(SOURCES))

此外,您应该在任何地方使用SOURCEDIRBUILDDIR,而不仅仅是在某些地方(否则您会遇到不一致)。最后,您的SOURCEDIR值是错误的:它不应该以我期望的/开头:

SOURCEDIR = src/code

SOURCES = $(wildcard $(SOURCEDIR)/*.cpp)