2013-06-04 71 views
6

我想使用的Makefile编译一堆位于src/code/*.cpp.cpp文件,然后编译每个*.obuild/,最后生成可执行文件与那些在build/为好。的Makefile:从目录编译到另一个目录

我已经阅读了一些我尝试使用的答案,但遇到了我不明白的问题。

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 [email protected] 

$(OBJECTS): $(BUILDDIR)/%.o : $(SOURCEDIR)/%.cpp 
    $(CC) $(FLAGS) $< -o [email protected] 

clean: 
    rm -f $(BUILDDIR)/*o $(BUILDDIR)/$(EXECUTABLE) 

我得到了下面的错误,我不知道为什么:

Makefile:19: target `src/code/main.cpp' doesn't match the target pattern 

我也看到,试图建立可执行文件时,它不使用.o文件,所以它似乎我的规则在这里是错误的。

+0

刚刚更新我的Makefile咯。 – user1777907

回答

8

您的patsubst功能错误;您不能使用外壳通配符,如*。你想:

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

你也应该使用SOURCEDIRBUILDDIR随处可见,不只是在某些地方(否则你会得到不一致)。最后,你SOURCEDIR值是错误的:它不应该与/开始我想到:

SOURCEDIR = src/code 

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

非常感谢!你已经解决了我的问题,它现在可以运行:)非常感谢! – user1777907

+1

不客气。不要忘记,因为你已经试图自己解决这个问题,所以应该是你最后的选择之一。以下是一些makefile调试提示:首先,'-p'选项将打印整个make数据库,包括所有变量的所有值。另外,在GNU中,您可以使用'$(info ...)'函数来输出变量值等信息。印刷这些价值观会给你一个关于问题出在哪里的线索。 – MadScientist

+2

为了澄清MadScientist的建议,例如'$(info ...)'可以用作'$(info $(SOURCES))'。它可以在感兴趣的变量的定义之后立即插入。 –

相关问题