一般來說,無論是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.
程式編譯和鏈結
程式進記憶體的一般過程 1 編譯compiler 編譯程式 將使用者源 編譯成若干個目標模組。2 鏈結link 鏈結程式 將形成的一組目標模組,及它們需要的庫函式鏈結在一起,形成乙個完整的裝入模組。3 裝入load 由裝入程式將裝入模組裝入記憶體,構造pcb,形成程序,開始執行 使用實體地址 靜態可...
關於程式的編譯和鏈結
在此,我想多說關於程式編譯的一些規範和方法,一般來說,無論是c c 還是pas,首先要把原始檔編譯成中間 檔案,在windows下也就是 obj 檔案,unix下是 o 檔案,即 object file,這個動作叫做編譯 compile 然後再把大量的object file合成執行檔案,這個動作叫作...
程式的編譯 鏈結
在linux下,使用gcc來編譯hello world時,只使用最簡單的命令 gcc hello.c a.out hello world 但上述過程可以分解為4個步驟,即預處理 編譯 彙編 鏈結。預處理 預編譯 gcc e hello.c o hello.i 或者 cpp hello.c hello...