對於動態連結庫和靜態連結庫的一些理解
以下內容只討論win中的動態連結和靜態連結。
首先,一個程式從編譯的執行的全過程:
預編譯->編譯->彙編->連結
其中,到了彙編這一步生成.obj檔案,也就是說,對於一個單獨的.c檔案,只要可以找到他的標頭檔案,到了這一步都不會報錯!
然後,這些彙編生成的obj檔案,我們可以選擇生成lib或lib+dll。 其中lib包含了所有需要的東西,包括程式碼,而lib+dll中,lib只包含dll中函式的入口,位置等等資訊,真正的程式碼在dll裡面。
使用靜態連結:
在win上利用visual studio 構建時,如果我們用到了靜態連結庫,需要兩個東西
1. .h檔案:指定include directories, 包含了lib檔案中函式的宣告等等,
2. 指明lib檔案的位置,即linker->General中的Additional Linker Directories, 指明包括lib檔案的路徑。然後再Input選項中,指明Additional Dependencies, 具體指明lib的名字。
結果:.h檔案裡面的內容被替換到載入了這個標頭檔案的那些原始檔裡面,然後.lib檔案在其他的原始碼生成了obj檔案以後被連結進入可執行檔案。此時.lib檔案在可執行程式中已經不需要了,刪掉也沒有關係,因為已經被連結進去了,所以這時候的可執行檔案會比較大。
使用動態連結
在win上利用visual studio構建程式,如果使用到了動態連結庫, 我們需要做
1. 標頭檔案。
2. 明lib檔案的位置,即linker->General中的Additional Linker Directories, 指明包括lib檔案的路徑。然後再Input選項中,指明Additional Dependencies, 具體指明lib的名字。
3. 使得程式在執行時可以找到dll的位置,所以其實有兩種方法,A:新增dll檔案的路徑到系統環境變數Path裡面 B:將dll檔案移動到系統預設的dll資料夾下。
其實這時候生成的可執行檔案會小很多,因為dll檔案並不在可執行檔案中,而是在程式執行時動態載入的。但是這時候dll檔案就不可以刪除了,否則程式會找不到dll檔案。真正被連線到可執行程式裡面的仍然是標頭檔案裡面的內容和lib檔案,但是這時候的lib檔案不包括真正的函式程式碼了,只包括dll檔案函式的入口!所以可執行檔案會小。上面說的方法是隱式呼叫