在我看來,學會寫簡單的Makefile,閱讀較複雜的makefile,是每個Linux程序員都必須擁有的基本素質。Makefile能夠自動識別哪些源文件被更改過,須要從新編譯,那些不須要。從而節省大型工程從新編譯的時間。規則以下:程序員
學會編寫Makefile,不單單有益於你在Linux下編寫大型工程。同時也能幫助你理解編譯原理。遠離IDE,瞭解編譯過程。markdown
廢話少說,Makefile其實最主要的語法只有一句:ui
target ... : prerequisites ... command......
target就是目標文件,prerequisites表示全部生成目標文件所需的擁有依賴關係的文件。command就是由依賴文件生成目標文件的編譯命令。
因此,對於單個的.c文件,一個最最簡單的Makefile以下:spa
object: main.c gcc -o object main.c
固然,對於單個C文件使用Makefile幾乎沒有意義。
下面來看一個稍複雜一點兒的Makefile文件:code
DIR=./
object: main.o 1.o 2.o
gcc -o object main.o 1.o 2.o
1.o: 1.c my.h
gcc -c 1.c
2.o: 2.c my.h
gcc -c 2.c
main.o: main.c my.h
gcc -c main.c
.PHONY: clean
clean:
rm $(DIR).o object
這是一個稍有實用價值的Makefile,工程由四個源文件構成:my.h 1.c 2.c main.c。
放在最前面的字符串
DIR=./
是變量定義。Makefile中的的變量定義多爲字符串,主要目的是爲了不重複長字符串輸入。
1.o 2.o main.o 分別是三個源文件生成的連接文件。若是你不知道連接文件是什麼。。。。找度娘吧。。
首先第一個target通常爲最終目標文件,以後的target通常爲過程文件。
.PHONY是用來定義僞目標用的。僞目標不是實際要生成的文件,通常爲make命令帶入的參數。例如上面文件中的clean,其對應的命令爲清除全部中間文件以及最後的目標文件。
其實,通常不定義僞目標也是OK的,可是一旦目錄下出現了和僞目標重名的文件。這時候Makefile執行僞目標命令就會出錯。由於Makefile不知道這是僞目標,而僞目標又沒有依賴文件,因此Makefile會跳過僞目標文件對應的命令。get
以上,是對Makefile的一個簡單入門介紹,通常,用以閱讀大多數的Makefile都已經足夠了。深究請百度或者Google。it
版權聲明:本文爲博主原創文章,未經博主容許不得轉載。編譯