2013-03-10 99 views
2

我一直在嘗試一段時間來在我的生成文件中使用自動依賴關係,但是我努力了很多工作,因爲我爲我的項目使用更復雜的結構,根文件夾中的每個文件。生成文件和項目目錄結構中的自動依賴關係

我使用這段代碼在我的makefile嘗試:

OBJECTS_DIR = obj/ 
SRCS_DIR = src/ 
#source files list, i.e : src/foo.cpp src/bar/foo2.cpp 
SOURCES = $(shell find $(SRCS_DIR) -name \*.cpp | xargs -d '\n') 
#object files list, i.e : obj/foo.o obj/foo2.o 
OBJECTS = $(addprefix $(OBJECTS_DIR), $(notdir $(SOURCES:.cpp=.o))) 
DEPS = $(OBJECTS_DIR)make.dep 

myproject : $(OBJECTS) 
    $(CC) $(CFLAGS) $(LDFLAGS) -o [email protected] $^ 

$(OBJECTS) : $(SOURCES) 
    $(CC) $(CFLAGS) $(LDFLAGS) -o [email protected] -c $(filter %/$(notdir $(@:.o=.cpp)), $(SOURCES)) 

$(DEPS): $(SOURCES) 
    $(CC) -MM $(SOURCES) > $(DEPS) 

-include $(DEPS) 

all : myproject 

clean : 
    @-rm -f $(RELEASE_DIR)* $(OBJECTS_DIR)* 

我想存儲在OBJ/make.dep文件中所有的依賴關係。這給了我下面的輸出(這裏FOO包括foo2的):

foo2.o: src/bar/foo2.cpp src/bar/headers/foo2.h 
foo.o: src/foo.cpp src/bar/headers/foo2.h 

我想每個目標文件的重命名,以具有以下的輸出: OBJ/foo2.o:SRC /酒吧/ foo2的.cpp src/bar/headers/foo2.h obj/foo.o:src/foo.cpp src/bar/headers/foo2.h

我試着用-MT選項沒有結果.. 。 此外,是否包含$(DEPS)足以包含我創建的依賴關係?我不應該用make.dep文件中寫的行來替換OBJECT規則中的$(filter%/ $(notdir $(@ :. o = .cpp)),$(SOURCES))嗎?

在此先感謝您的洞察力,請告訴我是否有任何其他方式來增強我的生成文件!

回答

1

將1個文件中的所有依賴關係存儲起來的原因是什麼?通常情況下,每個目標文件都有它自己的.d文件,這個文件是在編譯期間創建的,並且這就是你的目標文件-include。在這種情況下,將-MT標誌等添加到與初始編譯相同的命令中以使對象目錄和名稱正確無疑更爲簡單。

我會做一些沿着答案的線條更對這個問題:

make include directive and dependency generation with -MM

的好處是,所有的依存產生將在編譯步驟發生,所以你不必撥打gcc的額外電話。在一個文件中擁有所有的依賴關係對於一個小文件來說可能是可以的,但是如果你想讓你的makefile進行擴展,最好的辦法就是像上面這樣做。

+0

我寧願只製作一個包含所有依賴關係的文件。我用[這個鏈接](http://stackoverflow.com/questions/1979912/problem-generating-dependencies-in-makefile-using-mm)作爲一個靈感: – Aserre 2013-03-10 18:11:16

+0

已更新爲解答您的評論 – ThePosey 2013-03-10 19:33:21

+0

感謝您的鏈接。我認爲有一個大文件會更快...... – Aserre 2013-03-10 22:53:18

1

您應該使用模式規則來生成.o文件。

$(OBJECTS_DIR)/%.o : %.c 
     $(CC) $(CFLAGS) -c -o [email protected] $^ 

您必須處理相關性文件以將OBJECTS_DIR添加到目標路徑。 sed使這個很簡單。您可能也希望它取決於.h文件。

$(DEPS): $(SOURCES) $(shell find . -name '*.h') 
     $(CC) -MM $(SOURCES) | sed 's#^\(.*:\)#$(OBJECTS_DIR)\1#' > $(DEPS)