c语言库文件是dll还是lib,C语言之静态链接库与动态链接库(2)
我們發現,無論是靜態鏈接庫還是動態鏈接庫,最后都有lib文件,那么兩者區別是什么呢?
其實,兩個是完全不一樣的東西。靜態庫對應的lib文件叫靜態庫,動態庫對應的lib文件叫導入庫。實際上靜態庫本身就包含了實際執行代碼、符號表等等,而對于導入庫而言,其實際的執行代碼位于動態庫中,導入庫只包含了地址符號表等,確保程序找到對應函數的一些基本地址信息。
2.?對于靜態鏈接庫,我們在編譯和鏈接的時候已經將所有的代碼都導入進來,因此,當生成可執行文件以后,可執行文件包含所有的代碼。因此,在可執行文件運行時就不再需要靜態庫了,而對于動態鏈接庫,實際上,可執行文件不包含DLL中的內容,只是通過導入庫(.lib)知道了相應的地址信息,因此,可執行文件在運行時動態得去加載DLL.
五、小結
1. 靜態庫
* 靜態庫是把程序運行時需要使用的函數編譯在一個二進制文件中,擴展名為.lib。當程序link時把靜態庫中的二進制數據和程序其它數據放到一起。程序運行時不在需要lib和dll文件的支持。這樣做的壞處是開發出來的程序占用磁盤空間較大。特別是windows系統中本來就有或很多程序運行都需要的函數完全沒有必要每次開發程序時都要使用各自的靜態庫。
* 靜態庫為.lib文件形式存在
* 鏈接后產生的可執行文件包含了所有需要調用的函數的代碼,因此占用磁盤空間較大
* 如果有多個(調用相同庫函數的)進程在內存中間時運行,內存中就存有多份相同的庫函數代碼,因此占用內存空間較多。
2. 動態庫
* 動態庫在開發時僅是把dll中的函數名和參數放到應用程序中,應用程序運行時根據函數名和參數調用dll中的函數來運行,這樣操作系統中的應用程序可以同時使用同一個dll。可以有效地節省硬盤空間,當然這樣做使得程序設計更有層次。也有利于軟件工程師的分工和信息安全
* 動態庫以.dl文件形式存在,且一般都有一個對應的引入庫以.lib文件形式存在。純資源dll不生成.lib引入庫。
>引入庫和靜態庫的擴展名均為*.lib,但是引入庫僅包含一些函數名和參數信息,沒有函數體,是為調用動態庫服務的,它和動態庫的關系相當于.h文件和.cpp文件之間的關系;
* 動態庫兩種綁定方式
>靜態綁定(static blnding) 使用靜態綁定的程序在一開始載入內存的時候,載入程序就會把程序所有調用到的動態代碼的地址算出、確定下來。這種方式使程序剛運行時的初始化時間較長,不過一但完成動態裝載,程序的運行速度就很快。
>動態綁定(dynamic binding)?? 使用這種方式的程序并不在一開始就完成動態鏈接,而是直到真正調用動態庫代碼時,載入程序才計算(被調用的那部分)動態代碼的邏輯地址,然后等到某個時候,程序又需要調用另外某塊動態代碼時,載入程序才又去計算這部分代碼的邏輯地址。所以,這種方式侄程序初始化時間較短,但運行期間的性能比不上靜態綁定的程序。
*?使用動態庫的兩種方法(windows)
>方法一: load-time dynamic linking
在要調用dll的應用程序鏈接時,將dll的輸入庫文件(import library,.lib文件)包含進去。具體的做 法是在源文件開頭加一句#include ,然后就可以在源文件中調用dlldemo.dll中的輸出文件了。
>方法二: run-time dynamic linking? 不必在鏈接時包含輸入庫文件,而是在源程序中使用LoadLibrary或LoadLibraryEx動態的載入dll。
總結
以上是生活随笔為你收集整理的c语言库文件是dll还是lib,C语言之静态链接库与动态链接库(2)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 北京环球影城能不能带吃的
- 下一篇: 去英国多少钱啊?