2015-01-15 145 views
0

我有一個子目錄obj bin src包含在其中的drectiry子目錄測試。我有3個生成文件在一個在src一個obj和一個在子測試中。我想使用遞歸make,但是我有一個錯誤。 目錄結構:Makefile包含來自其他目錄的頭文件

subdir-test 

     - Makefile1 
     - src 
      - all.c files and Makefile2 
     - obj 
      - all.o files and Makefile3 
     - include 
      - functions.h 
     - bin 

,這裏是化妝文件: Makefile1:

SUBDIRS = src obj 

    subdirs : 
     for dir in $(SUBDIRS);\ 
     do \ 
     $(MAKE) -C $$dir ;\ 
     done 

    .PHONY : clean 

    clean : 
     rm -rf bin/* obj/* 

Makefile2:

inc = -I ../include/ 

    all : main.o factorial.o 

    main.o : main.cpp functions.h 
     cc -c $< -I $(inc) -o ../obj/[email protected] -lstdc++ 

    factorial.o : factorial.cpp functions.h 
     cc -c $< -I $(inc) -o ../obj/[email protected] -lstdc++ 

Makefile3:

run : main.o factorial.o 
     cc $^ -o ../bin/[email protected] 

在呼籲從分測試創建目錄-f Makefile1我得到以下錯誤:

for dir in src obj;\ 
    do \ 
    make -C $dir ;\ 
    done 
make[1]: Entering directory `/home/betatest/Public/subdir-test/src' 
make[1]: *** No rule to make target `functions.h', needed by `main.o'. Stop. 
make[1]: Leaving directory `/home/betatest/Public/subdir-test/src' 
make[1]: Entering directory `/home/betatest/Public/subdir-test/obj' 
make[1]: *** No rule to make target `main.o', needed by `run'. Stop. 
make[1]: Leaving directory `/home/betatest/Public/subdir-test/obj' 
make: *** [subdirs] Error 2 

我有其他的問題,因爲我想要寫循環如下:

for dir in $(SUBDIRS) 
    do 
    $(MAKE) -C $$dir 
    done 

有我我也在循環中出錯。我哪裏錯了。

+1

如果你的make文件沒有命名爲'makefile'或者'Makefile'(或者可能還有其他一些混合大小寫變體,取決於你的'make'版本),那麼你還必須告訴'make'要使用哪個文件 - 比如'make -C src -f Makefile2' ... – twalberg 2015-01-15 16:22:01

+0

這不是那個問題,但問題是頭文件在包含文件夾中,它不包含在src文件夾中的Makefile2,所以我認爲我在「inc」變量用法。請建議解決方案如何包含包含文件夾中的頭文件。 – 2015-01-15 17:23:28

回答

1

你的makefiles是這樣寫的,我相信使用依賴關係的相對路徑可以解決你的問題。由於您正在按正確的順序處理目錄,因此可以將Makefile1保持原樣。

Makefile2將成爲:

inc = -I ../include/ 

    all : main.o factorial.o 

    main.o : main.cpp ../include/functions.h 
     cc -c $< -I $(inc) -o ../obj/[email protected] -lstdc++ 

    factorial.o : factorial.cpp ../include/functions.h 
     cc -c $< -I $(inc) -o ../obj/[email protected] -lstdc++ 

而且makefile3大概可以保持不變,因爲main.o和factorial.o不OBJ /只存在,因爲在makefile2錯誤的。

請注意,目前main.o和factorial.o將始終被編譯(並且可能會使用.PHONY),因爲目標實際上是../obj/main.o,類似於run - > ../bin /跑。 在這種情況下,我不認爲你可以通過使用三種不同的makefile獲得太多收益,但這取決於你。

+0

謝謝@cacsar !!!!!它幫助我解決問題!!!!!!! – 2015-01-16 05:09:40

+0

如果您點擊接受答案按鈕,則聲望將會提高。 – cacsar 2015-01-16 21:48:20

相關問題