14

我正在尝试使用 Makefile 编译.cpp位于 中的一堆文件,然后在中src/code/*.cpp编译每个文件,最后生成带有这些文件的可执行文件。*.obuild/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 文件,所以我的规则在这里似乎是错误的。

4

1 回答 1

13

你的patsubst功能是错误的;您不能使用 shell 通配符,例如*. 你要:

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

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

SOURCEDIR = src/code

SOURCES = $(wildcard $(SOURCEDIR)/*.cpp)
于 2013-06-04T17:55:35.507 回答