makefile 工程管理
GNU make
Linux程序員必須學會使用GNU make來構建和管理自己的軟件工程。
GNU 的 make 能夠使整個軟件工程的編譯、鏈接只需要一個命令就可以完成。
Makefile
make在執行時,需要一個名為Makefile的文件。
Makefile文件描述了整個工程的編譯,鏈接等規則。
其中包括哪些源文件需要編譯以及如何編譯;
需要創建哪些庫文件以及如何創建這些庫文件;
如何最後產生我們想要的可執行文件。
Makefile(例子)
hello:main.o func1.o func2.o gcc main.o func1.o func2.o -o hello main.o:main.cgcc -c main.c func1.0:func1.c gcc -c func1.c func2.o:func2.c gcc -c func2.c .PYONY:clean clean: rm -f hello main.o func1.o func2.o
由main.c func1.c func2.c文件生成一個hello的可執行文件。
Makefile(術語)
規則:用於說明如何生成一個或多個目標文件。
規則格式:
targets : prerequisites
command
目標 : 依賴 命令
main.o : main.c gcc -c main.c
註意:命令需要以 [TAB] 鍵 開始。
目標
在Makefile中,規則的順序是很重要的。
Makefile中只應該有一個最終目標,其它的目標都是被整個目標所連帶出來的。
所以,一定要讓 make 知道最終目標是什麽。
一般來說,定義在Makefile 中的目標可能會有很多,但是,
第一條規則中的目標將被確立為最終目標。
文件名
make 命令默認在當前目錄下尋找名字為 makefile 或 Makefile 的工程文件。
當名字不為這兩者之一時,可以使用 make
偽目標:
makefile 中把那些沒有任何依賴只有執行動作的目標稱為"偽目標"(phony targets)。
.PHONY : clean
clean :
rm -f hello main.o func1.o func2.o
".PHONY" 將 “clean” 目標聲明為偽目標。
當執行make後會生成很多 *.o文件,如果加上上面的clean,再執行 make clean 會按照上面的命令刪除指定的目標文件。
變量
hello : main.o func1.o func2.o
gcc main.o func1.o func2.o -o hello
思考:如果要為 hello 目標添加一個依賴,如:func3.o,該如何修改?
答案1:
hello : main.o func1.o func2.o func3.o
gcc main.o func1.o func2.o func3.o -o hello
答案2:
obj = main.o func1.o func2.o func3.o
hello : $(obj)
gcc $(obj) -o hello
在 makefile 中,存在系統默認的自動化變量
$^ : 代表所有的依賴文件
$@ : 代表目標
$< : 代表第一個依賴文件
例:
hello : main.o func1.o func2.o gcc main.o func1.o func2.o -o hello
改寫成==>
hello : main.o func1.o func2.o gcc $^ -o $@
註釋和取消回顯
Makefile 中 “#”字符後的內容被視作註釋。
@:取消回顯
hello : hello.c
@gcc hello.c -o hello
makefile 工程管理