MAKEFILE 學習筆記 —— 簡介
一. 編譯與鏈接
把源文件編譯成中間代碼文件,在 Windows 下也就是 .obj 文件,Linux 下是 .o 文件,即 Object File,這個動作叫做編譯(compile)。編譯時,編譯器檢查語法的正確性,函數與變量的聲明的正確性。只有所有的語法正確,編譯器就可以編譯出中間目標文件,每個源文件對應一個目標文件。
把大量的 Object File 合成可執行文件,這個動作叫作鏈接(link)。鏈接時,主要鏈接全局變量與函數。
二. 編譯規則
- 如果工程沒有被編譯過,則將所有的源文件進行編譯並鏈接爲目標程序。
- 如果該工程,有幾個 c 文件被改變了,只重新編譯這幾個 c 文件 。
- 如果是頭文件被改變了,則只重新編譯引用這幾個頭文件的 c 程序。
三. MAKEFILE 格式
makefile 是通過文件之間相互依賴進行編譯並鏈接的,即目標文件是由哪些文件生成的。格式如下:
target: files
command
- target : 生成的目標文件
- files : 要生成 target 所需要的文件或是目標
- command:編譯或鏈接命令
注:
command 命令一定以 TAB 鍵開始,並且前面不能有空格,若使用 vim在 /etc/vim/vimrc 文件中將 set expandtab 刪除,它將導致格式錯誤。
代碼例子:
aaa: main.o func.o
gcc -o aaa main.o func.o
main.o: main.c ex2.h
gcc -std=c99 -c main.c
func.o: func.c ex2.h
gcc -std=c99 -c func.c
clean:
rm -fr *.o aaa
四. MAKE 的工作過程
- 找到當前目錄下名爲“makefile”或“MAKEFILE”文件
- 再“makefile”中找到第一個 target,在上面的代碼中爲 aaa,並把這個文件作爲最終的文件
- 如果 aaa 不存在或者 aaa 所依賴的文件比如 main.o 比較新,那麼會重新運行 gcc -o aaa main.o func.o 來生成 aaa
- 如果 aaa 所依賴的.o文件不存在,比如 main.o 不存在,則運行 gcc -std=c99 -c main.c 來生成 main.o,在運行 2 來生成 aaa
- 依次類推直到生成 aaa。
參考文獻
[1] 陳浩 《跟我一起寫Makefile》