2013-06-04 72 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))'。它可以在感興趣的變量的定義之後立即插入。 –

相關問題