2012-05-04 56 views
2

我有以下設置爲我的C++項目:生成文件自動SRC文件檢測和依存產生

在src文件夾中,有*的.cpp和相應的* .h文件和obj的文件夾 我想要我的.o文件。

到目前爲止,編譯和鏈接是沒問題的。但是現在我有太多的.cpp和.h文件將它們手動放入Makefile中。所以我決定寫Makefile中的該小指令:

collect_sources: 
@echo "collecting source files"; 
@echo "SRCS = \\" > sources; 
@for file in ./src/*.cpp; \ 
do \ 
    echo "$$file \\" >> sources; \ 
done 

我也做

-include sources 

在Makefile

產生的文件sources看起來很好的開始,雖然有反斜槓在我不喜歡的最後一行。但afaik也應該是有害的。

我現在還需要自動建立依賴關係。在我在我直接在Makefile中*的.cpp,文件中定義爲SRCS最後一個版本,下面的代碼是好的:

$(SRCDIR)/%.cpp: 
    @$(CXX) $(DEPFLAGS) -MT \ 
    "$(subst $(SRCDIR),$(OBJDIR),$(subst $(EXT_SRC),$(EXT_OBJ),$$file))" \ 
    $(addprefix ,$$file) >> $(DEP); 
clear_dependencies: 
    echo "" > $(DEP); 

depend: clear_dependencies $(SRCS) 

但隨着包括sources -file,它永遠不會到達上代碼塊。

這裏是在Makefile頂部定義的常量:

CXX = g++ 
CXXFLAGS = -Wall \ 
     -Wextra \ 
     -Wuninitialized \ 
     -Wmissing-declarations \ 
     -pedantic \ 
     -O3 \ 
     -p -g -pg 
LDFLAGS = -p -g -pg 
DEPFLAGS = -MM 

SRCDIR = ./src 
OBJDIR = ./obj 

TARGET = ./bin/my_funky_function_which_is_not_the_real_name 

-include sources 

OBJSTMP = $(SRCS:.cpp=.o) 
OBJS  = $(OBJSTMP:$(SRCDIR)=$(OBJDIR)) 
DEP = depend.main 
EXT_SRC = .cpp 
EXT_OBJ = .o 

我缺少什麼?我的方法是否有效/可行?

+0

在旁邊注意:請不要建議任何工具,做到這一切。我真的很想了解這一點,並完全掌控發生了什麼。 – stefan

+0

有一個簡單的錯誤和很多可能的改進。你想走多遠? – Beta

+0

一步一步的絕對最佳;-) – stefan

回答

7

好的,你問了。

1:您的collect_sources:... include sources是光榮的Rube Goldberg hackery。只是這樣做:

SRCS = $(wildcard ./src/*.cpp) 

如果你想用眼睛來確認它,你可以這樣做:

$(info $(SRCS)) 

2:

clear_dependencies: 
    echo "" > $(DEP); 

不僅僅是爲了美觀起見,我們來解決這個問題。

clear_dependencies: 
    $(RM) $(DEP); 

3:

$(SRCDIR)/%.cpp: 
    @$(CXX) $(DEPFLAGS) -MT \ 
    "$(subst $(SRCDIR),$(OBJDIR),$(subst $(EXT_SRC),$(EXT_OBJ),$$file))" \ 
    $(addprefix ,$$file) >> $(DEP); 

這將需要一些工作。首先是眼前的問題:目標是存在的真實文件,而規則沒有先決條件。因此,規則將不會運行(我不知道爲什麼它在以前的版本中爲你工作,也許別的東西是不同的)。作爲一個臨時的解決辦法,我建議我們切換到靜態模式規則和僞目標:

.PHONY:$(SRCS) 
$(SRCS) : $(SRCDIR)/%.cpp: 
    @$(CXX) $(DEPFLAGS) -MT \ 
    ... 

查看是否所有的作品,那麼我們就可以解決大的東西。

+0

首先,感謝您的回答。我不明白你的意思是「目標是存在的真實文件」。你是對的,它不是最初的代碼。而不是$$文件它是一個@的東西。 – stefan

+0

@stefan,可能是'$ @'。在實踐中,當考慮是否重建類似'./src/foo.cpp'的東西時,Make會使用這個規則。這幾乎可以肯定是一個已經存在的文件(除非這個問題比你告訴我們的更多)。所以Make會得出結論,該文件是最新的,不需要重建。即使/當Make運行規則,我不認爲'$$文件'的東西將工作。 – Beta

+0

你是對的。並與您的「PHONY」建議和「$ @」它工作正常:) – stefan