MAKEFILE學習筆記--簡介

MAKEFILE 學習筆記 —— 簡介


一. 編譯與鏈接

  1. 把源文件編譯成中間代碼文件,在 Windows 下也就是 .obj 文件,Linux 下是 .o 文件,即 Object File,這個動作叫做編譯(compile)。編譯時,編譯器檢查語法的正確性,函數與變量的聲明的正確性。只有所有的語法正確,編譯器就可以編譯出中間目標文件,每個源文件對應一個目標文件。

  2. 把大量的 Object File 合成可執行文件,這個動作叫作鏈接(link)。鏈接時,主要鏈接全局變量與函數。


二. 編譯規則

  1. 如果工程沒有被編譯過,則將所有的源文件進行編譯並鏈接爲目標程序。
  2. 如果該工程,有幾個 c 文件被改變了,只重新編譯這幾個 c 文件 。
  3. 如果是頭文件被改變了,則只重新編譯引用這幾個頭文件的 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 的工作過程

  1. 找到當前目錄下名爲“makefile”或“MAKEFILE”文件
  2. 再“makefile”中找到第一個 target,在上面的代碼中爲 aaa,並把這個文件作爲最終的文件
  3. 如果 aaa 不存在或者 aaa 所依賴的文件比如 main.o 比較新,那麼會重新運行 gcc -o aaa main.o func.o 來生成 aaa
  4. 如果 aaa 所依賴的.o文件不存在,比如 main.o 不存在,則運行 gcc -std=c99 -c main.c 來生成 main.o,在運行 2 來生成 aaa
  5. 依次類推直到生成 aaa。

參考文獻

[1] 陳浩 《跟我一起寫Makefile》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章