關於程式的編譯和連結

鴨脖發表於2012-11-27
一般來說,無論是C、C++、還是pas,首
先要把原始檔編譯成中間程式碼檔案,在Windows下也就是 .obj 檔案,UNIX下是 .o 檔案,
即 Object File,這個動作叫做編譯(compile)。然後再把大量的Object File合成執行
檔案,這個動作叫作連結(link)。

編譯時,編譯器需要的是語法的正確,函式與變數的宣告的正確。對於後者,通常是你需
要告訴編譯器標頭檔案的所在位置(標頭檔案中應該只是宣告,而定義應該放在C/C++檔案中)
,只要所有的語法正確,編譯器就可以編譯出中間目標檔案。一般來說,每個原始檔都應
該對應於一箇中間目標檔案(O檔案或是OBJ檔案)。

連結時,主要是連結函式和全域性變數,所以,我們可以使用這些中間目標檔案(O檔案或是
OBJ檔案)來連結我們的應用程式。連結器並不管函式所在的原始檔,只管函式的中間目標
檔案(Object File),在大多數時候,由於原始檔太多,編譯生成的中間目標檔案太多,
而在連結時需要明顯地指出中間目標檔名,這對於編譯很不方便,所以,我們要給中間
目標檔案打個包,在Windows下這種包叫“庫檔案”(Library File),也就是 .lib 檔案
,在UNIX下,是Archive File,也就是 .a 檔案。

總結一下,原始檔首先會生成中間目標檔案,再由中間目標檔案生成執行檔案。在編譯時
,編譯器只檢測程式語法,和函式、變數是否被宣告。如果函式未被宣告,編譯器會給出
一個警告,但可以生成Object File。而在連結程式時,連結器會在所有的Object File中
找尋函式的實現,如果找不到,那到就會報連結錯誤碼(Linker Error),在VC下,這種
錯誤一般是:Link 2001錯誤,意思說是說,連結器未能找到函式的實現。你需要指定函式
的Object File.

相關文章