天天看點

makefile學習筆記(多目錄嵌套調用、變量使用)

<a href="http://blog.csdn.net/leexiang_han/article/details/9274229">http://blog.csdn.net/leexiang_han/article/details/9274229</a>

學習了幾天的makefile的嵌套調用編寫也有一些心得,先聲明,我也是初學者寫文章隻是為了更好的交流,也希望避免其他剛入Linux程式設計大門的童鞋少走彎路。以下都是經過我多次測試并跑成功的,如有偏差還請見諒與指正。

我有兩個練習例子:

①先來說說第一個例子:生成一個可執行檔案edit

top dir(根目錄)下有源檔案main.c、makefile(主)、檔案夾sub1、檔案夾sub2;子目錄sub1裡有源檔案sub1.c和makefile(次1);子目錄sub2裡有源檔案sub2.c和makefile(次2)。

main.c裡有主函數,需要調用sub1.c裡的排序函數(按升序排)和sub2.c裡的排序函數(按降序排)。要求通過根目錄下的makefile嵌套調用子目錄下的makefile來編譯,最後連結生成可執行檔案edit。

好了,我就不貼三個源檔案的C代碼了,大家自己寫用來測試,我就直接貼makefile的編寫了。

首先是子目錄sub1下的makefile:

sub1.o : sub1.c

              gcc-c sub1.c

接下來是子目錄sub2下的makefile:

sub2.o : sub2.c

       gcc -csub2.c

都很簡單對吧,就一條正常的編譯指令,最後是根目錄下的makefile:

VPATH=./sub1 ./sub2

obj=main.o sub1.o sub2.o

edit : $(obj)

       gcc -oedit main.o ./sub1/sub1.o ./sub2/sub2.o

main.o : main.c

       gcc -cmain.c

       $(MAKE) -C./sub1

       $(MAKE) -C./sub2

.PHONY : clean

clean :

       rm editmain.o -fr

       rm./sub1/*.o -fr

       rm./sub2/*.o -fr

②下面就說說我的第二個練習例子:生成兩個可執行檔案edit1、edit2

top dir(根目錄)下有源檔案lib.c、makefile(主)、檔案夾main1、檔案夾main2;子目錄main1裡有源檔案main1.c和makefile(次1);子目錄main2裡有源檔案main2.c和makefile(次2)。

main1.c和main2.c裡都有主函數,需要調用lib.c裡的求和函數,隻是所傳遞的參數值不同。要求通過根目錄下的makefile嵌套調用子目錄下的makefile來編譯,最後連結生成可執行檔案edit1和edit2,最後執行edit1和edit2應該能得到兩個不同的值(也就是lib.c所求得的和)。

首先是子目錄main1的makefile:

main1.o : main1.c

       gcc -cmain1.c

接下來是子目錄main2的makefile:

main2.o : main2.c

       gcc -cmain2.c

最後是根目錄下的makefile:

VPATH = ./main1 ./main2

obj1 = main1.o lib.o

obj2 = main2.o lib.o

all : edit1 edit2

edit1 : $(obj1)

       gcc -o./main1/edit1 ./main1/main1.o lib.o

       $(MAKE) -C./main1

lib.o : lib.c

       gcc -clib.c

edit2 : $(obj2)

       gcc -o ./main2/edit2./main2/main2.o lib.o

       $(MAKE) -C./main2

       rm *.o -fr

       rm./main1/*.o ./main1/edit1 -fr

       rm./main2/*.o ./main2/edit2 –fr

難道你認為這次學習就結束了嗎??當然不!上面這些makefile的确能滿足嵌套調用的基本需求,但是你不覺得./sub1/sub1.c,./sub2/sub.2這些路徑的表達很煩瑣嗎?萬一這是個大的工程項目,突然要往某個子目錄下增加一個源檔案,那麼修改這些makefile還不弄死你啊,可怕的不是累而是容易遺漏某一處而導緻錯誤,是以對于立志成為一個好的makefile的編寫員的人這些還遠遠不夠!下面就讓我們來對以上的makefile進行一次改頭換面吧!領略一下變量的風采!

①    第一個例子的根目錄下的makefile修改如下,其餘兩個makefile不變:

cur-dir:=$(shell pwd)

s1=$(cur-dir)/sub1

s2=$(cur-dir)/sub2

       gcc -oedit main.o $(s1)/sub1.o $(s2)/sub2.o

sub1.o : $(s1)/sub1.c

       $(MAKE) -C$(s1)

sub2.o : $(s2)/sub2.c

       $(MAKE) -C$(s2)

       rm $(s1)/*.o-fr

       rm$(s2)/*.o -fr

②    第二個例子的根目錄下的makefile修改如下,其餘兩個makefile不變:

s1=$(cur-dir)/main1

s2=$(cur-dir)/main2

       gcc -o$(s1)/edit1 $(s1)/main1.o lib.o

main1.o : $(s1)/main1.c

       gcc -o$(s2)/edit2 $(s2)/main2.o lib.o

main2.o : $(s2)/main2.c

       rm$(s1)/*.o $(s1)/edit1 -fr

       rm$(s2)/*.o $(s2)/edit2 -fr

繼續閱讀