編譯和鏈接的區別是什麼?

編譯

將預處理生成的文件,經過詞法分析、語法分析、語義分析以及優化後編譯成若干個目標模塊。可以理解爲將高級語言翻譯爲計算機可以理解的二進制代碼,即機器語言。

鏈接

由鏈接程序將編譯後形成的一組目標模塊以及它們所需要的庫函數鏈接在一起,形成一個完整的載入模型。鏈接主要解決模塊間的相互引用問題。分爲地址和空間分配,符號解析和重定位幾個步驟。在編譯階段生成目標文件時,會暫時擱置那些外部引用,而這些外部引用就是在鏈接時進行確定的,鏈接器在鏈接時,會根據符號名稱去相應模塊中尋找對應符號。待符號確定之後,鏈接器會重寫之前那些未確定的符號的地址,這個過程就是重定位。鏈接一般分爲靜態鏈接、載入時動態鏈接以及運行時動態鏈接三種。

載入

由載入程序將載入模塊載入內存

編譯和鏈接是爲將用戶程序從硬盤上調入內存並將其轉換成可執行程序服務的。用編譯器時的compile就是在進行編譯,link就是鏈接,運行程序可以看到。

以C/C++語言爲例,把源文件編譯成中間代碼我那件,在Windows下面爲.obj文件,在UNIX、Linux下面就是.o文件,即Object File,該動作被稱爲編譯。然後再把大量的Object File合成執行文件,這個動作稱爲鏈接。

編譯時,編譯器需要的是語法正確,函數與變量的聲明正確。而一般來說,每個源文件都應該對應於一箇中間目標文件(.o文件或是.obj文件)來鏈接應用程序。鏈接就是那些目標文件之間相互鏈接自己所需要的函數和全局變量,而函數可能來源於其他目標文件或庫文件。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章