2014-02-27 45 views
1

在我的項目中,我有一個項目目錄和4個子目錄:bin,inc,obj和src。所有的源文件都在「src」中,所有的頭文件都是「inc」。Makefile:不知道如何使用變量創建一個好的生成文件

我正在嘗試make一個makefile,將所有的源代碼編譯成「obj」目錄中的相同名稱的新擴展對象,然後將它們全部鏈接到「bin」目錄中的最終project.out中。以下是我迄今爲止:

 C_FILES = $(wildcard src/*.c) 
     OBJ_FILES = $(addprefix obj/,$(notdir $(C_FILES:.cpp=.o))) 
     LD_FLAGS = 
     CC_FLAGS = -MMD -c -Wall -lm 
     BINARY = bin/project.out 

     all: $(BINARY) 
     $(BINARY): $(OBJ_FILES) 
      gcc $(LD_FLAGS) -o [email protected] $< 

     OBJ_FILES = $(patsubst $(C_FILES),$(OBJ_FILES),$(SOURCES)) 
      $(CC) $(CC_FLAGS) $< -o [email protected] 

     -include $(OBJ_FILES:.o=.d) 

我收到「上線12人失蹤分隔符」 我是新來的makefile,那麼,什麼是我作出了錯誤?我已經嘗試了GNU makefile教程,而且我明顯錯過了一些東西。

+0

僅供參考:您是否已經看過[CMake](http://www.cmake.org/cmake/help/cmake_tutorial.html)?它可以大大簡化Makefiles的創建,即組織您的項目結構。 – yegorich

回答

3

你很近。

「缺少分隔符」錯誤意味着您在行的開頭使用了空格而不是字面製表符。不幸的是,Make對此很挑剔。在vim中你可以點擊CtrlV標籤進入一個文字標籤。

除此之外,您只需做兩處更改即可讓您的Makefile正常工作。這裏的diff

--- Makefile 
+++ Makefile 
@@ -1,4 +1,4 @@ 
-C_FILES = $(wildcard src/*.c) 
+C_FILES = $(wildcard src/*.cpp) 
OBJ_FILES = $(addprefix obj/,$(notdir $(C_FILES:.cpp=.o))) 
LD_FLAGS = 
CC_FLAGS = -MMD -c -Wall -lm 
@@ -8,7 +8,7 @@ 
$(BINARY): $(OBJ_FILES) 
     gcc $(LD_FLAGS) -o [email protected] $< 

-OBJ_FILES = $(patsubst $(C_FILES),$(OBJ_FILES),$(SOURCES)) 
+obj/%.o: src/%.cpp 
     $(CC) $(CC_FLAGS) $< -o [email protected] 

-include $(OBJ_FILES:.o=.d) 

的第一個變化是,有時你參考.c文件,有時.cpp文件;你需要做到這一點。

第二個變化是,您需要指定一個規則,讓Make可以使用pattern rulesrc/foo.cpp文件變成obj/foo.o文件。

下面是更新後的Makefile:

C_FILES = $(wildcard src/*.cpp) 
OBJ_FILES = $(addprefix obj/,$(notdir $(C_FILES:.cpp=.o))) 
LD_FLAGS = 
CC_FLAGS = -MMD -c -Wall -lm 
BINARY = bin/project.out 

all: $(BINARY) 
$(BINARY): $(OBJ_FILES) 
     gcc $(LD_FLAGS) -o [email protected] $< 

obj/%.o: src/%.cpp 
     $(CC) $(CC_FLAGS) $< -o [email protected] 

-include $(OBJ_FILES:.o=.d) 

不幸的是,你不能只是複製和粘貼,並期望它的工作,因爲製表符搞的一團糟。您必須手動更改第9行和第12行的開頭才能使用Tab鍵字符。

相關問題