1. 程式人生 > >C語言編譯和連結

C語言編譯和連結

編譯連結是使用高階語言程式設計所必須的操作,一個源程式只有經過編譯、連結操作以後才可以變成計算機可以理解並執行的二進位制可執行檔案。

編譯是指根據使用者寫的源程式程式碼,經過詞法和語法分析,將高階語言編寫的程式碼轉變為功能有效的彙編程式碼。

編譯過程如下:

1、  預編譯過程

在c語言的預編譯過程中,主要是對巨集定義、條件編譯語句、標頭檔案包含語句以及特殊符號進行處理。

對於巨集定義語句,比如#define NAME “user”,則在預編譯階段,會將程式中所有的NAME都替換為usr,當前有一點值得注意的是字串中的NAME是不會被替換的。而#define語句在經過預編譯後的程式碼中則不會出現。巨集定義中還有一個#undef,對於它的處理是從取消的位置開始,後面的程式碼中都不會進行替換了,同樣的經過預編譯後的程式碼不會有#undef語句了。

對於條件編譯語句指的是#ifdef、#else、#ifndef、#elif、#endif、(注意還有#if)。條件編譯指的是——如果#ifdef debug,如果定義了debug,那麼後面部分的程式碼就會被編譯,否則編譯#else後的程式碼。對於條件編譯語句,在預編譯階段處理它,是根據它過濾掉那些不必要的程式碼。

標頭檔案包含指令,之所以有標頭檔案是為了是某些定義可以讓更多的c源程式使用。在預編譯的過程中,預編譯程式會將標頭檔案中所有的定義都新增到它的輸出檔案中去,而不再有標頭檔案包含指令。

2、  編譯的過程

經過預編譯以後,將產生新的源程式。編譯程式將通過詞法分析和語法分析,確認所有的指令都符合語法規則,並將其翻譯成等價的中間程式碼或彙編程式碼。

3、  優化及彙編過程

將彙編程式碼翻譯成機器指令——即生成計算機系統可識別的二進位制程式碼。彙編的過程實際上就是將組合語言程式碼翻譯成為機器語言的過程。這時候生成的程式碼實際上並不能直接執行,要經過連結以後才可以執行。

連結過程如下:

所謂連結的過程就是指,經過編譯後將會生成一個目標檔案,這個目標檔案可能會呼叫printf等函式,對於printf函式,它的目的碼在系統的函式庫中(一般使用者用到的很多函式庫都存在於/usr/lib或者/lib中),連結所要做的就是將這些函式庫中相應的程式碼組合到目標檔案中去。

連結分為:

靜態連結;就是把函式庫中包含的目的碼靜態新增到可執行檔案中。一般靜態連結生成的檔案比較大。可獨立執行。

動態連結;將這些函式庫的路徑、函式名等資訊新增到可執行檔案中去,在執行過程中動態載入函式庫。需要函式庫的支援。

 

原文連結:

https://www.cnblogs.com/winifred-tang94/p/5833831.html