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

Makefile:从目录编译到另一个目录,makefile,Makefile,我试图使用Makefile编译位于src/code/*.cpp中的一组.cpp文件,然后在build/中编译每个*.o,最后用build/中的文件生成可执行文件 我已经阅读了一些我试图使用的答案,但遇到了我不理解的问题 CC = g++ FLAGS = -g -c SOURCEDIR = /src/code BUILDDIR = build EXECUTABLE = DesktopSpecificController SOURCES = $(wildcard src/code/*.cpp)

我试图使用Makefile编译位于
src/code/*.cpp
中的一组
.cpp
文件,然后在
build/
中编译每个
*.o
,最后用
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)

我还看到,在尝试构建可执行文件时,它没有使用.o文件,因此我的规则在这里似乎是错误的。

您的
patsubst
函数是错误的;不能使用shell通配符,如
*
。你想要:

OBJECTS = $(patsubst $(SOURCEDIR)/%.cpp,$(BUILDDIR)/%.o,$(SOURCES))
此外,您还应该在任何地方使用
SOURCEDIR
BUILDDIR
,而不仅仅是在某些地方(否则会出现不一致)。最后,您的SOURCEDIR值是错误的:它不应该以
/
开头,我希望:

SOURCEDIR = src/code

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

刚刚更新了我的Makefile,非常感谢!你已经解决了我的问题,现在可以了:)非常感谢!不客气。别忘了,这应该是你最后的度假胜地之一,在你尝试自己解决它之后。以下是一些makefile调试提示:首先,
-p
选项将打印出整个make数据库,包括所有变量的所有值。此外,在GNU make中,您可以使用
$(info…
函数打印变量值等信息。打印这些值将为您提供问题所在的良好线索。例如,为了澄清MadScientist的建议,
$(info…
可以用作
$(info$(SOURCES))
。它可以在定义感兴趣的变量后立即插入。
SOURCEDIR = src/code

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