1. 程式人生 > >makefile 工程管理

makefile 工程管理

tab man 定義 == file -s 系統 microsoft make

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.c
    
gcc -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

-f 文件名 來指定。

偽目標:

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 工程管理