[導讀]為什么要使用Makefile工具?當源碼文件比較多的使用使用時候,不適合直接gcc命令來編譯,工具這時候需要一個自動化編譯工具來編譯。使用使用Make 一般說是工具GNU Make 是一個軟件,用于將源碼文件編譯器為可執行的使用使用二進制文件,make工具主要用于完整自動化編譯,工具make編譯的使用使用時候需要Makefile文件提供編譯文件。

當源碼文件比較多的工具時候,不適合直接gcc命令來編譯,使用使用這時候需要一個自動化編譯工具來編譯。工具Make 一般說是使用使用GNU Make 是一個軟件,用于將源碼文件編譯器為可執行的工具二進制文件,make工具主要用于完整自動化編譯,使用使用make編譯的工具時候需要Makefile文件提供編譯文件。 a.c------>***.s------>***.o
b.c------>xxx.s------>xxx.o
xxx.o + ***.o ------>test
缺點:修改任一個文件所有.c都要重新編譯,文件更多時可想而知,時間耗不起! gcc -c a.c
gcc -c b.c
gcc a.o b.o –o test
01.如果工程沒有編譯過,那么工程中的所有.c文件都要被編譯并且鏈接成可執行程序。
02.如果工程中只有個別C 文件被修改了,那么只編譯這些被修改的C文件即可。
03.如果工程的頭文件被修改了,那么我們需要編譯所有引用這個頭文件的C文件,并且鏈接成可執行文件。 2、makefile?的基本規則:?當依賴比目標新執行命令根據Makefile的基本規則,我們針對上面的gcc編譯過程來寫一個Makefile文件,如下所示: test:a.o b.o
gcc –o test a.o b.o
a.o: a.c
gcc -c a.c
b.o: b.c
gcc -c b.c
clean:
rm *.o
rm test
這樣我們使用 make 命令就可以完成對 a.c ?b.c的編譯和鏈接,直接生成test執行文件。 Makefile 也可以添加變量,但Makefile跟C語言不一樣,沒有類似于 int char …等很多的類型,只有字符串類型,比如可以定義一個 object = a.o b.o ?引用變量使用$(objdect)即可。 這樣就可以將上面的Makefile盡心簡化,不需要輸入兩次的 a.o b.o, 具體如下: objdect = a.o b.o
test:$(object)
gcc –o test $(object)
a.o: a.c
gcc -c a.c
b.o: b.c
gcc -c b.c
clean:
rm *.o
rm test
對于上面的Makefile如果有很多.c文件,那我們就需要寫很多依賴規則,可以使用通配符來對其簡化,%.c 表示所有的.c文件,%.o表示所有的.o文件,當然我們就可以把上面的! b.o 依賴于 b.c和a.o依賴于a.c 等寫成?%.o 依賴%.c的形式。對于命令則需要引入另一個叫做自動化變量了,如何通過一行命令來從不同的依賴文件中生成對應的目標?自動化變量就是用來實現這個功能的。在自動化變量中常用的是$@、$<、$^ 這樣我們又可以對MakeFile進行簡化啦……….,如下所示: objdect = a.o b.o
test:$(object)
gcc –o test $(object)
%.o: %.c
gcc -c [ DISCUZ_CODE_0 ]lt;
clean:
rm *.o
rm test
我們總是使用make clean來執行刪除任務,單當我們在當前目錄添加一個名為clean的文件,那么make clean還能奏效嗎?如下: 解決辦法:使用偽目標,將clean定義為假想目標即可。 objdect = a.o b.o
test:$(object)
gcc –o test $(object)
%.o: %.c
gcc -c [ DISCUZ_CODE_0 ]lt;
clean:
rm *.o test
.PHONY:clean
6、Makefile條件判斷Makefile同樣支持條件判斷,語法有兩種如下:?
條件關鍵字:ifeq、ifneq、ifdef、ifndef,四個條件關鍵字分為兩對:ifeq和ifneq用于是否相等;ifdef和ifndef 用于判斷是否定義。
免責聲明:本文內容由21ic獲得授權后發布,版權歸原作者所有,本平臺僅提供信息存儲服務。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯系我們,謝謝!