1.序言:
前面的課程講解了從gcc編譯過程到其實踐,大家可以看到其實在這些步驟中有些是可以簡化編譯的,但由於參數多以及項目中文件數量多的原因難免會造成錯誤甚至是浪費大量的時間在這編譯上,為此linux系統中專門也有這個工具:makefile。
2.原理:
其實本質Makefile文件(通常開頭是大寫M)就是一個shell文件通過指定的規則來編譯文件。知識點如下:
makefile工具是通過其規則來執行命令,一般其內容分為宏定義以及命令。簡單的宏定義在最后講解下,這先講命令格式:
target ... : prerequisites ... command
其中target就是目標文件可以是.o文件也可以是可執行文件;
prerequisites是生成target所需要的依賴文件,可以是代碼文件,也可以是目標文件;
command就是makefile執行的命令,這里之前忘記了多謝崔好好的提醒,一定是要開Tab鍵開始后輸入,后面回復也有;
本文就講解一下makefile工具的使用。
3.實踐:
這節課中使用上節課原有的文件calc.c、calc.h、calcmain.c3個文件(不知道請回看),先清空掉其它文件,,再創建Makefile文件,步驟如下:
1>創建Makefile文件,並輸入如下內容:
calc:calc.o calcmain.o gcc -Wall calc.o calcmain.o -o calc calcmain.o:calcmain.c gcc -Wall -c calcmain.c -o calcmain.o calc.o:calc.c gcc -Wall -c calc.c -o calc.o
.PHONY:clean
clean: rm calc.o calcmain.o calc
上面代碼其中第一行:
calc:calc.o calcmain.o:calc為生成的可執行文件對應規則的target;而calc.o calcmain.o是生成calc文件的依賴文件;
gcc -Wall calc.o calcmain.o -o calc:這就是依賴條件滿足執行的命令;
同理calcmain.o:calcmain.c:calcmain.o這個目標文件要依賴於calcmain.c文件,注明:如果單修改了calcmain.c源文件,那么可用make calcmain.o和make calc命令執行生成此目標文件操作后鏈接生成可執行文件
gcc -Wall -c calcmain.c -o calcmain.o:生成目標文件;
最后clean是偽目標,通常情況下在其前面加上如下防止當前目錄有相同的指令:
.PHONY:clean
2>現在這個Makefile文件制作好,直接輸入命令make就可以完成編譯工作:
make
如果想刪除相關生成的文件執行:
make clean
如果單修改了calcmain.c源文件,那么單生成calcmain.o文件,在鏈接成可執行文件,執行如下:
make clacmain.o make calc
這樣在項目文件多的時候就可以省掉很多時間了!這個命令一敲很爽吧,哈哈。。。。。。
3>細心的讀者就可以想到了:竟然Makefile是shell文件,不能用變量來替換其內容多次出現的問題,這個問題真好其實這就是接下來講的部分了。
EXE=calc OBJECTS=calcmain.o calc.o $(EXE):$(OBJECTS) gcc -Wall $^ -o $EXE calcmain.o:calcmain.c gcc -Wall -c $< -o $@ calc.o:calc.c gcc -Wall -c $< -o $@ clean: rm -f $(EXE) $(OBJECTS)
這樣使用一些預定義變量如$^就是所有依賴文件;$<就是依賴的第一個文件;$@就是當前的target對象。這樣在文件較多時候就比較好維護了。