2016-11-12 142 views
0

我有一個與subdir項目的生成文件的問題。 項目目錄樹是如下:Makefile子目錄遞歸

project 
├── Makefile 
├── main.cpp 
| 
├── lib1 
│ ├── lib1.cpp 
│   ├── lib1.h 
│   └── Makefile 
| 
├── lib2 
│   ├── Makefile 
│   ├── lib2_1.cpp 
│   ├── lib2_1.h 
| ├── lib2_2.cpp 
│   └── lib2_2.h 
| 
├── lib3 
│   ├── Makefile 
│   ├── lib3.cpp 
│   └── lib3.h 

每個子目錄的makefile文件(LIB1,LIB2 ...)是這樣的:

SRC_DIR = ./ 
BUILD_DIR = ./obj/ 

DEPS = lib1.o 

all: $(BUILD_DIR)$(DEPS) 

$(BUILD_DIR)%.o: $(SRC_DIR)%.cpp $(SRC_DIR)%.h 
    mkdir -p $(BUILD_DIR) 
    g++ --std=c++11 $< -c -o [email protected] 

clean: 
    rm -fr $(BUILD_DIR) 

我的問題是:如何創建廠名位於項目目錄中的文件,還是生成文件「root」? 我無法創建一個makefile,它以遞歸方式在子目錄中執行makefiles,並鏈接每個subdir的obj文件夾中的所有目標文件。

你能幫我嗎?請

+0

只是一個評論,它不會解決你的問題。或者它會呢? ;)恕我直言,每個子目錄應該有一個歸檔/所以目標,而不是一個lib1.o目標。 –

+0

爲什麼每個子目錄都應該有這樣的目標? –

+0

archive/so,挑一個。我不知道你想要創建什麼,但是你的目錄被命名爲lib [123],所以我假設你正在構建庫。 –

回答

0

我會做這樣的:

SUBDIRS = lib1 lib2 lib3 

main: main.cpp $(SUBDIRS) 
     $(CC) $(CFLAGS) $(LDFLAGS) -o [email protected] $< $(wildcard $(addsuffix /obj/*.o,$(SUBDIRS))) $(LDLIBS) 

.PHONY: $(SUBDIRS) 
$(SUBDIRS): 
     $(MAKE) -C [email protected] 

這個好東西:它會與make -jN正常工作的並行編譯,並且可以運行make lib1等,如果你只是想建立一個子目錄。

糟糕的是:即使沒有變化,它也會在每次運行make時重新鏈接main程序。

如果你想避免壞事,你可能會考慮使用非遞歸makefile,這將需要重寫你的makefiles。

如果你願意爲每個子目錄創建一個以目錄命名的子目錄(例如,liblib1.a等),而不是鏈接所有的目標文件,你可以使用遞歸的makefile。訣竅是根makefile必須能夠自己推斷或計算庫的名稱。它不能使用wildcard等來找到它們。

+0

謝謝,太棒了! –