關於程式的編譯和連結
一般來說,無論是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.
先要把原始檔編譯成中間程式碼檔案,在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.
相關文章
- 程式的編譯和連結原理分析編譯
- 關於go程式的靜態連結編譯是否可以不依賴系統C庫Go編譯
- (轉)編譯和連結的區別編譯
- GCC編譯和連結過程GC編譯
- C語言中編譯和連結C語言編譯
- 關於庫的編譯編譯
- 程式設計師的自我修養-編譯連結程式設計師編譯
- 關於Electron原生模組編譯的一點總結編譯
- 編譯連結過程編譯
- 編譯、連結學習筆記(一)簡述編譯連結過程編譯筆記
- C++應用程式在Windows下的編譯、連結(四)動態連結C++Windows編譯
- 從編譯連結到cmake編譯
- 關於VC的編譯模式 (轉)編譯模式
- 關於TIJ的編譯問題編譯
- GCC編譯過程(預處理->編譯->彙編->連結)GC編譯
- C語言編譯和連結過程簡介C語言編譯
- CMake 進行多專案中dll的編譯和連結編譯
- 關於行連結和行遷移和消除
- 編譯、彙編、連結、載入、顯示編譯
- C++編譯連結的那些小事 .C++編譯
- 關於Gdb工具的交叉編譯、移植編譯
- 關於預編譯頭 (轉)編譯
- [翻譯]關於Swift的編譯時間優化Swift編譯優化
- 關於支援OPenACC的編譯器說明編譯
- 《程式設計師的自我修養》(一)——編譯與靜態連結程式設計師編譯
- 0909關於編譯原理編譯原理
- 關於Android APK反編譯AndroidAPK編譯
- linux編譯so庫不要生成字尾和軟連結Linux編譯
- 關於編譯型語言程式碼優化的一點迷思編譯優化
- gcc 從語言編譯全過程 預處理---->編譯---->彙編----->連結GC編譯
- C語言的編譯連結執行過程C語言編譯
- 關於動態連結串列的理解
- 【經典】連線oracle的總結(關於tnsname和監聽)Oracle
- cmake使用教程(九)-關於安卓的交叉編譯安卓編譯
- 關於JSP預編譯的中文問題JS編譯
- 關於 VC 編譯的猜想與試驗 (轉)編譯
- 關於Basic程式直譯器及編譯原理的簡單化(1)--詞法分析和代數式求值 (轉)C程式編譯原理詞法分析
- C++應用程式在Windows下的編譯、連結:第三部分 靜態連結(一)C++Windows編譯