makefile簡介
當然在我們做一個大型開發是不可能一個一個的GCC去,這個時候我們的makefile就派上用場了。
GNU的make能夠使整個軟件工程的編譯、鏈接只需要一個命令就可以完成。所以程序員必須得會makeflie。
make在執行時,只需要一個名爲makefile(Makefile)的文件。makefile文件描述了整個工程的編譯,鏈接等規則。其中包括:工程中的那些源文件需要編譯以及如何編譯;需要創建那些庫文件以及如何讓創建這些庫文件、最後產生我們想要得到的可執行文件。
makefile規則示例
hello:main.o func1.o func2.o
gcc main.o func.o func2.o -o hello
main.o:main.c
gcc -c main.c
func1.o:func1.c
gcc -c func1.c
func2.o:func2.c
gcc -c func2.c
.PHONY:clean
clean:
rm -f hello main.o func1.o func2.o
規則:用於說明如何產生一個或多個目標文件,規則格式如下:
targets:prerequisities
command
目標:依賴
命令 //命令需要以【Tab】鍵開始//
在makefile中,規則的順序很重要,因爲makefile中只應該有一個最終目標,其他的目標都是這個目標所帶出來的,所以一定要讓make知道你的最終目標是什麼。一般來說,定義在makefile中的目標可能會有很多,但是第一條規則種的目標將被確立爲最終目標。
文件名
makefile命令默認在當前目錄下尋找名字爲makefile 或者Makefile的工程文件,當名字不爲這兩者之一時,可以使用:
make -f 文件名 的命令。
僞目標
makefile中把那些沒有任何依賴只有執行動作的目標稱爲“僞目標(phony targets)”
如上面例子中
.PHONY:clean
clean:
rm -f hello main.o func1.o func2.o
“.PHONY”將“clean”目標聲明爲僞目標變量
當有大量重複性修改時我們可以使用變量。
例子:
obj=
hello:$(obj)
gcc
$(obj) -o hello
在makefile中,存在系統默認的自動化變量
$^:代表所有依賴文件
$@:代表目標
$<:代表第一個依賴文件。
例:
hello:main.o func1.o func2.o
gcc main.o func.o func2.o -o hello
可以改寫爲:hello:main.o func1.o func2.o
gcc $^ -o $@
雜項
makefile中“#”字符後的內容被視作註釋
hello:main.o func1.o func2.o
@gcc main.o func.o func2.o -o hello
@:取消回顯