什麼是makefile
?或許很多winodws
的程式設計師都不知道這個東西,因為那些windows
的整合開發環境(integrateddevelopment environment,ide)
都為你做了這個工作,但我覺得要作乙個好的和professional
的程式設計師,makefile
還是要懂。這就好像現在有這麼多的html
的編輯器,但如果你想成為乙個專業人士,你還是要了解html
的標識的含義。特別在unix
下的軟體編譯,你就不能不自己寫makefile
了,會不會寫makefile
,從乙個側面說明了乙個人是否具備完成大型工程的能力。
因為,makefile
關係到了整個工程的編譯規則。乙個工程中的原始檔不計其數,並且按型別、功能、模組分別放在若干個目錄中,makefile
定義了一系列的規則來指定,哪些檔案需要先編譯,哪些檔案需要後編譯,哪些檔案需要重新編譯,甚至於進行更複雜的功能操作,因為makefile
就像乙個shell
指令碼一樣,其中也可以執行作業系統的命令。
makefile
帶來的好處就是——「自動化編譯」,一旦寫好,只需要乙個make
命令,整個工程完全自動編譯,極大的提高了軟體開發的效率。make
是乙個命令工具,是乙個解釋makefile
中指令的命令工具,一般來說,大多數的ide
都有這個命令,比如:delphi
的make
,visualc++
的nmake
,linux
下gnu
的make
。可見,makefile
都成為了一種在工程方面的編譯方法。
現在講述如何寫makefile
的文章比較少,這是我想寫這篇文章的原因。當然,不同廠商的make
各不相同,也有不同的語法,但其本質都是在「檔案依賴性」上做文章,這裡,我僅對gnu
的make
進行講述,我的環境是redhatlinux 8.0
,make
的版本是3.80
。畢竟,這個make
是應用最為廣泛的,也是用得最多的。而且其還是最遵循於ieee1003.2-1992
標準的(posix.2)。
在這篇文件中,將以c/c++
的原始碼作為我們基礎,所以必然涉及一些關於c/c++
的編譯的知識,相關於這方面的內容,還請各位檢視相關的編譯器的文件。這裡所預設的編譯器是unix
下的gcc
和cc。
關於程式的編譯和鏈結
在此,我想多說關於程式編譯的一些規範和方法,一般來說,無論是c
、c++
、還是pas
,首先要把原始檔編譯成中間**檔案,在windows
下也就是.obj
檔案,unix
下是.o
檔案,即objectfile
,這個動作叫做編譯(compile
)。然後再把大量的objectfile
合成執行檔案,這個動作叫作鏈結(link)。
編譯時,編譯器需要的是語法的正確,函式與變數的宣告的正確。對於後者,通常是你需要告訴編譯器標頭檔案的所在位置(標頭檔案中應該只是宣告,而定義應該放在c/c++
檔案中),只要所有的語法正確,編譯器就可以編譯出中間目標檔案。一般來說,每個原始檔都應該對應於乙個中間目標檔案(o
檔案或是obj
檔案)。
鏈結時,主要是鏈結函式和全域性變數,所以,我們可以使用這些中間目標檔案(o
檔案或是obj
檔案)來鏈結我們的應用程式。鏈結器並不管函式所在的原始檔,只管函式的中間目標檔案(objectfile
),在大多數時候,由於原始檔太多,編譯生成的中間目標檔案太多,而在鏈結時需要明顯地指出中間目標檔名,這對於編譯很不方便,所以,我們要給中間目標檔案打個包,在windows
下這種包叫「庫檔案」(libraryfile)
,也就是.lib
檔案,在unix
下,是archivefile
,也就是.a
檔案。
總結一下,原始檔首先會生成中間目標檔案,再由中間目標檔案生成執行檔案。在編譯時,編譯器只檢測程式語法,和函式、變數是否被宣告。如果函式未被宣告,編譯器會給出乙個警告,但可以生成objectfile
。而在鏈結程式時,鏈結器會在所有的objectfile
中找尋函式的實現,如果找不到,那到就會報鏈結錯誤碼(linkererror
),在vc
下,這種錯誤一般是:link2001
錯誤,意思說是說,鏈結器未能找到函式的實現。你需要指定函式的objectfile.
好,言歸正傳,gnu
的make
有許多的內容,閒言少敘。
from ubuntu wiki
跟我一起寫Makefile 概述
什麼是makefile 也許非常多winodws 的程式猿都不知道這個東西。由於那些windows 的整合開發環境 integrateddevelopment environment,ide 都為你做了這個工作,但我認為要作乙個好的和professional 的程式猿,makefile 還是要懂。這...
跟我一起寫 Makefile
概述 什麼是makefile?或許很多winodws的程式設計師都不知道這個東西,因為那些windows的ide都為你做了這個工作,但我覺得要作乙個好的和professional的程式設計師,makefile還是要懂。這就好像現在有這麼多的html的編輯器,但如果你想成為乙個專業人士,你還是要了解h...
跟我一起寫 Makefile
概述 什麼是makefile?或許很多winodws的程式設計師都不知道這個東西,因為那些windows的ide都為你做了這個工作,但我覺得要作乙個好的和professional的程式設計師,makefile還是要懂。這就好像現在有這麼多的html的編輯器,但如果你想成為乙個專業人士,你還是要了解h...