Makefile:从目录编译到另一个目录
我试图使用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)
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)