1:神馬是Dll和Lib,神馬是靜態連接和動態連接函數
你們都懂的,DLL就是動態連接庫,LIB是靜態連接庫。DLL其實就是EXE,只不過沒main。spa
動態連接是相對於靜態連接而言的。所謂靜態連接就是把函數或過程直接連接到可執行文件中,成爲可執行程序中的一部分,當多個程序調用一樣的函數時,內存裏就會有這個函數的多個拷貝,浪費內存資源。而動態連接則是提供了一個函數的描述信息給可執行文件(並無內存拷貝),當程序被夾在到內存裏開始運行的時候,系統會在底層建立DLL和應用程序之間的鏈接關係,當執行期間須要調用DLL函數時,系統纔會真正根據連接的定位信息去執行DLL中的函數代碼。版本控制
在WINDOWS32系統底下,每一個進程有本身的32位的線性地址空間,若一個DLL被進程使用,則該DLL首先會被調入WIN32系統的全局堆棧,而後經過內存映射文件方式映射到這個DLL的進程地址空間。若一個DLL被多個進程調用,則每一個進程都會接收到該DLL的一個映像,而非多份的拷貝。但,在WIN16系統下,每一個進程須要擁有本身的一份DLL空間,能夠理解爲什麼靜態連接沒啥區別。索引
2:DLL和LIB區別和聯繫。進程
DLL是程序在運行階段才須要的文件。內存
LIB是程序編譯時須要連接的文件。ci
DLL只有一種,其中必定是函數和過程的實現。資源
LIB是有兩種。若只生成LIB的話,則這個LIB是靜態編譯出來的,它內部包含了函數索引以及實現,這個LIB會比較大。若生成DLL的話,則也會生成一個LIB,這個LIB和剛纔那個LIB不一樣,它是隻有函數索引,沒有實現的,它很小。可是這倆LIB依然遵循上個原則,是在編譯時候是須要被連接的。若不連接第一個LIB的話,在程序運行時會沒法找到函數實現,當掉。若不連接第二個LIB的話,在程序運行時依然會沒法找到函數實現。但第二種LIB有一種替代方式,就是在程序裏,使用LoadLibrary,GetProcAddress替代第二個LIB的功能。第一種LIB生成的EXE文件會很大,由於LIB全部信息被靜態連接進EXE裏了。第二種LIB生成的EXE文件會比較小,由於函數過程實現依舊在DLL內。開發
咱們能夠將靜態編譯的LIB稱爲 靜態連接庫。但動態編譯的LIB稱爲 引入庫。可能會比較好一些。編譯
靜態連接LIB的優勢是免除掛接動態連接庫,缺點是EXE大,版本控制麻煩些。
動態連接DLL的優勢是文件小,版本更換時換DLL就行了,缺點是多了點文件。動態連接如果被多個進程使用,會更加方便和節省內存。
3:爲何編譯DLL時總會同時生成一個LIB?這個LIB有用嗎?
若咱們不是用靜態連接,而使用DLL,那麼咱們也須要一個LIB,這個LIB的做用是被連接到程序裏,在程序運行時告訴系統你須要什麼DLL文件。這個LIB裏保存的是DLL的名字和輸出函數入口的順序表。它是有意義的。
固然,若咱們的應用程序裏不連接這個LIB,則可使用LoadLibrary,GetProcAddress來告訴系統咱們在運行時須要怎麼着DLL以及其內的函數。
4:DLL意義。
1:DLL真正實現了跨語言。各類語言均可以生成DLL,而對系統以及應用程序來講,哪一種語言生成的DLL是沒有區別的。
2:DLL有足夠的封裝性,對於版本更新有很大好處。由於DLL是運行期間纔會使用,因此,即便DLL內函數實現有變化(只要參數和返回值不發生變化),程序是不須要進行編譯的。大大提升了軟件開發和維護的效率。
3:DLL被多個進程使用,由於有內存映射機制,無需佔用更多內存。