2016-05-23 82 views
1

我創建了一個項目,我最初認爲它很簡單(很少文件),但現在項目正在增長。我試圖重新組織目錄結構,但我不知道如何修改makefile。使用Makefile修改項目組織

這裏是我的結構:

root_dir 
    Makefile 
    main.cc 
    fileA.cc 
    fileA.h 
    fileB.cc 
    fileB.h 

而且FILEB取決於從的fileA(#include "fileA.h")和我的Makefile看起來像這樣:

all: myExec 

myExec: main.o fileA.o fileB.o 
    g++ -Wall main.o fileA.o fileB.o -o myExec 

main.o: main.cc fileA.h fileB.h 
    g++ -Wall -c main.cc 

fileA.o: fileA.cc fileA.h 
    g++ -Wall -c fileA.cc 

fileB.o: fileB.cc fileB.h fileA.h 
    g++ -Wall -c fileB.cc 

現在,我想有這樣的事情:

root_dir 
    Makefile 
    main.cc 
    dirA 
    fileA.cc 
    fileA.h 
    dirB 
    fileB.cc 
    fileB.h 

我讀過我可以在每個subdi創建一個Makefile rectory,但我不確定這是可行的,因爲fileB依賴於fileA(在另一個子目錄中)。

或者我應該修改我的主Makefile以包含subdir?

謝謝。

+0

您目前的Makefile如何工作? – Quentin

+0

你需要提供一個真實世界的例子,'fileB'如何依賴'fileA'?像這些細節是至關重要的,你甚至沒有說你在做什麼,可執行文件?圖書館? – user657267

+0

我添加了Makefile描述。 我提到fileB包含fileA(#include'fileA.h')。我創建一個可執行文件。 – whiteShadow

回答

0

如果你堅持使用一個makefile文件,這與你已經做的沒什麼不同,你只需要正確設置include標誌。由於make的內置規則,您的makefile也可以大大簡化,並且GCC的依賴關係生成標誌不需要手動添加標頭。

N.b.將main.cc更改爲myExec.cc,它更直觀IMO,並允許您跳過鏈接配方。

srcs := $(wildcard dirA/*.cc dirB/*.cc) 
objs := $(srcs:.cc=.o) myExec.o 
deps := $(objs:.o=.d) 

CPPFLAGS := -MMD -MP 

myExec: CC := $(CXX) 
myExec: $(objs) 
myExec.o: CPPFLAGS += -IdirA -IdirB 
dirA/%.o: CPPFLAGS += -IdirB 

.PHONY: clean 
clean: ; $(RM) $(objs) $(deps) myExec 

-include $(deps) 

也就是說,很難看出利用這樣一個人爲的例子將項目拆分爲多個目錄會帶來什麼好處。

+0

謝謝。但是我發現你的解決方案不容易閱讀。而且它保持相當簡單,因爲這是一個簡單的例子,但實際上我有大約10個子目錄,這會使你的解決方案的makefile複雜化很多,不是嗎? – whiteShadow

+0

我用這個網站'學習'makefile:http://mrbook.org/blog/tutorials/make/ – whiteShadow

+0

@whiteShadow它取決於,如果你擁有的是其他源文件的同一個可執行文件在那些目錄中,那麼它就像簡單作爲將dir添加到'wildcard',你可能應該考慮使用makefile dir作爲包含的根目錄,並執行'#include「dirB/fileB.h'等,這樣你就不需要指定單獨的include編譯時的目錄 – user657267