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

use*_*907 7 makefile

我试图用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)
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)

你也应该使用SOURCEDIRBUILDDIR无处不在,不仅在某些地方(否则你会得到不一致).最后,您的SOURCEDIR值是错误的:它不应该以/我期望的开头:

SOURCEDIR = src/code

SOURCES = $(wildcard $(SOURCEDIR)/*.cpp)
Run Code Online (Sandbox Code Playgroud)

  • 为了澄清MadScientist的建议,`$(info ...)`可以用作`$(info $(SOURCES))`,例如.它可以在定义感兴趣的变量后立即插入. (2认同)