1. 程式人生 > >Makefile之關於程式的編譯和連結

Makefile之關於程式的編譯和連結

關於程式的編譯和連結

——————————

      在此,我想多說關於程式編譯的一些規範和方法,一般來說,無論是CC++、還是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.

好,言歸正傳,GNUmake有許多的內容,閒言少敘,還是讓我們開始吧。