make和makefile簡明基礎


0.make、makefile是什么?

  makefile定義了一系列的規則,來規定哪些部分先編譯,哪些部分后編譯,寫好makefile以后,只需一個make命令就可以讓整個工程完全自動編譯,所以簡單的說,make&makefile實現了大工程的自動化編譯。

1.makefile里是什么?

  看個makefile的簡單例子:

1 target:main.o test.o
2     cc -o target main.o teat.o
3 main.o:main.c x.h
4     cc -c main.c
5 test.o:test.c y.h
6     cc -c test.c
7 clean:
8     rm target main.o test.o

  可以看出,makefile中主要由兩個部分組成:#1文件依賴關系和#2生成所需命令。其中clean是一個偽目標文件,可用".PHONY:clean"在其前面注明。執行make命令即可編譯,執行make clean即可刪除所有目標文件。

2.make是如何工作的?

  0)make會在當前目錄下找名字為"makefile "或"Makefile"的文件;

  1)若找到makefile文件,接着找第一個目標文件(target),並把它作為最終的目標文件;

  2)若target文件依賴后面的.o文件更新,則執行后面定義的命令會生成target文件;

  3)某個.o文件也會依賴若干個源文件和頭文件,它們根據命令生成.o文件。

根據make的依賴性,make會一層層地去找文件的依賴性,直到最終第一個target文件被編譯成功。整個過程類似於數據結構中棧的操作。

3.特別注意——makefile中的變量賦值:

  "="是最基本的賦值,makefile會將整個makefile展開后,再決定變量的值。

  ":="是覆蓋當前的值,其取決於當前的賦值,而不是最終的賦值(比較好判斷)。

  "?="是若沒有被賦值過就賦等號后的值。

  "+="是添加等號后的值。

4.可以利用變量減少重復,及利用makefile的自動推導簡化makefile,例如:

1 #Makefile
2 objects:main.o test.o
3 target:$(objects)
4     cc -o target $(objects)
5 main.o:x.h       #這就用到了自動推導。
6 test.o:y.h
7 .PHONY:clean   #說明clean是一個偽目標文件。
8 clean:
9     rm target $(objects)

  因為這個編譯較簡單,優勢可能不太明顯,若要是大工程,變量和自動推導的使用會讓makefile有很大的簡化。這個部分其實還很豐富,先暫記到這。

5.小注:

0)makefile中命令必須以[tab]鍵開始。

1)若指定特定的makefile,可用"-f"和"--file"參數。

2)include,被包含的文件會被原封不動的放在當前文件包含的位置,如:

include foo.make

注意,不能以[tab]鍵開始。
  簡單記錄了自己的筆記,對於錯誤和疏漏,歡迎賜教指正。關於make和makefile的更多內容,推薦陳皓的《跟我一起寫Makefile》和GNU Makefile手冊。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM