1. 鏈結、靜態鏈結和動態鏈結的概念
程式設計追求的是模組化,乙個複雜軟體由許多模組組成,通常將每個模組進行單獨編譯,然後將它們組裝起來,組裝的過程就是鏈結。鏈結處理的是把各個模組之間相互應用的部分都處理好,使得各個模組之間能夠正確地鏈結。按照是否將所有目標檔案(linux的.o ,win的.obj)生成乙個可執行檔案(win的.exe )將鏈結分為靜態鏈結和動態鏈結。
靜態鏈結(參考和《程式設計師的自我修養》)
將多個目標檔案鏈結成乙個可執行檔案。
靜態庫
多個目標檔案組成的集合(linux .a win的 lib)在vs中生成的靜態庫,只產生乙個.lib
靜態鏈結時,鏈結器從靜態庫中取得所需的**,複製到可執行檔案中,其特點是可執行檔案中包含了庫**的乙份完整拷貝;
靜態鏈結的缺點:(1)空間浪費:每個可執行檔案都含有乙份靜態庫的副本 (2)可擴充套件性差:程式的更新、部署發布麻煩,更新庫時,整個程式都需要重新進行鏈結。
動態鏈結
將每個目標檔案分開,不再生成乙個可執行檔案,而是在程式執行時才進行鏈結。
動態庫
包含可由多個程式同時使用的**和資料庫(linux 下的.so、 win下的 .dll)
在vs中新建生成的動態庫會產生乙個.lib 和乙個dll
當程式被裝載的時候,系統的動態聯結器會將程式所需要的所有動態鏈結庫裝載到程序的位址空間,並完成重定位工作。
區別
動態鏈結將程式和庫的鏈結過程從裝載前推遲到了裝載的時候,會存在一定的效能損失,可通過延遲繫結進行優化。
2. vs中配置動態庫
1)dll檔案配置,在環境變數中進行配置,然後會在$(path)中搜尋相應的dll
win下程式將按照以下順序來定位dll檔案
a)含exe檔案的目錄
b)工程目錄
c)win系統目錄
d)win目錄
e)path中的目錄
2)include標頭檔案配置
配置->配置屬性->vc++目錄->包含目錄,新增include 標頭檔案所在的路徑
3)lib庫目錄的配置
配置->配置屬性->vc++目錄->庫目錄,新增相應的lib路徑
d:\program files (x86)\opencv\build\x86\vc12\lib
動態庫中的lib:該lib包含了函式所在的dll檔案和檔案中函式位置的資訊(索引),函式實現**由執行時載入在程序空間中的dll提供
5)執行庫選擇
配置->配置屬性->c/c+±>**生成->執行庫 選擇mdd
3. vs中配置靜態庫
1)include標頭檔案配置
同動態配置一樣
2)lib庫目錄配置
配置->配置屬性->vc++目錄->庫目錄,新增相應的lib路徑
這裡選擇static靜態庫
d:\program files (x86)\opencv\build\x86\vc12\staticlib
靜態庫中的lib:該lib包含函式**本身(即包括函式的索引,也包括實現),在編譯時直接將**加入程式當中
4)執行庫選擇
配置->配置屬性->c/c+±>**生成->執行庫 選擇mtd
動態鏈結庫和靜態鏈結庫
函式和資料被編譯進乙個二進位制檔案 通常擴充套件名為.lib 在使用靜態庫的情況下,在編譯鏈結可執行檔案時,鏈結器從庫中複製這些函式和資料並把它們和應用程式的其它模組組合起來建立最終的可執行檔案 exe檔案 在使用動態鏈結庫的時候,往往提供兩個檔案 乙個引入庫和乙個dll。引入庫包含被dll匯出的函...
動態鏈結庫和靜態鏈結庫的區別
平時總聽人講動態鏈結庫 靜態鏈結庫 lib dll so等名詞,一直搞不清楚這幾者之間的區別以及各自的應用場合。後來上網仔細查了一下資料,終於搞清楚了,在這裡整理一下先。動態鏈結庫 動態鏈結庫中包含了多個已經被編譯 鏈結好的函式和資料資源,但並不包含函式的原始碼。動態鏈結庫在windows下是.dl...
動態鏈結庫和靜態鏈結庫的區別
本文我們學習和了解一下動態鏈結庫和靜態鏈結庫的區別。靜態鏈結庫 lib檔案 將函式 編譯到應用程式中,應用程式執行時全部載入到記憶體。優點是不需要掛在dll檔案,缺點是生成的應用程式比較大。動態鏈結庫 lib和dll檔案 lib編譯到應用程式中,實際函式 寫在dll中。在應用程式執行時,lib只是用...