庫的三種載入方法 顯示載入 隱示載入 延遲載入

2021-06-12 07:17:39 字數 2818 閱讀 6855

1. 靜態庫

靜態庫的載入 需要標頭檔案和lib庫檔案  編譯時使用lib庫中引用的內容,嵌入到目標檔案,實現內容的重用僅僅是在編譯時

2.動態庫的載入

1.隱示載入 2.顯示載入  3.延遲載入

動態鏈結庫dll,靜態鏈結庫lib, 導入庫lib

目前以lib字尾的庫有兩種,一種為靜態鏈結庫(static libary,以下簡稱「靜態庫」),另一種為動態連線庫(dll,以下簡稱「動態庫」)的導入庫(import libary,以下簡稱「導入庫」)。

靜態庫是乙個或者多個obj檔案的打包,所以有人乾脆把從obj檔案生成lib的過程稱為archive,即合併到一起。比如你鏈結乙個靜態庫,如果其中有錯,它會準確的找到是哪個obj有錯,即靜態lib只是殼子。

動態庫一般會有對應的導入庫,方便程式靜態載入動態鏈結庫,否則你可能就需要自己loadlibary調入dll檔案,然後再手工getprocaddress獲得對應函式了。有了導入庫,你只需要鏈結導入庫後按照標頭檔案函式介面的宣告呼叫函式就可以了。

導入庫和靜態庫的區別很大,他們實質是不一樣的東西。靜態庫本身就包含了實際執行**、符號表等等,而對於導入庫而言,其實際的執行**位於動態庫中,導入庫只包含了位址符號表等,確保程式找到對應函式的一些基本位址資訊。

這也是實際上很多開源**發布的慣用方式:

1. 預編譯的開發包:包含一些.dll檔案和一些.lib檔案。其中這裡的.lib就是導入庫,而不要錯以為是靜態庫。但是引入方式和靜態庫一樣,要在鏈結路徑上新增找到這些.lib的路徑。而.dll則最好放到最後產生的應用程式exe執行檔案相同的目錄。這樣執行時,就會自動調入動態鏈結庫。

3. 如果你只有dll,並且你知道dll中函式的函式原型,那麼你可以直接在自己程式中使用loadlibary調入dll檔案,getprocaddress

dll:

動態鏈結庫 (dll) 是作為共享函式庫的可執行檔案。動態鏈結提供了一種方法,使程序可以呼叫不屬於其可執行**的函式。函式的可執行**位於乙個 dll 中,該 dll 包含乙個或多個已被編譯、鏈結並與使用它們的程序分開儲存的函式。dll 還有助於共享資料和資源。多個應用程式可同時訪問記憶體中單個 dll 副本的內容。

動態鏈結與靜態鏈結的不同之處在於它允許可執行模組(.dll 檔案或 .exe 檔案)僅包含在執行時定位 dll 函式的可執行**所需的資訊。在靜態鏈結中,鏈結器從靜態鏈結庫獲取所有被引用的函式,並將庫同**一起放到可執行檔案中。

使用動態鏈結代替靜態鏈結有若干優點。dll 節省記憶體,減少交換操作,節省磁碟空間,更易於公升級,提供售後支援,提供擴充套件 mfc 庫類的機制,支援多語言程式,並使國際版本的建立輕鬆完成。

api 就是應用程式程式設計介面。它是能用來操作元件、應用程式或者作業系統的一組函式。典型的情況下,api 由乙個或多個提供某種特殊功能的 dll 組成。

dll 是乙個檔案,其中包含了在 microsoft? windows? 下執行的任何應用程式都可呼叫的函式。執行時,dll 中的函式動態地鏈結到呼叫它的應用程式中。無論有多少應用程式呼叫 dll 中的某個函式,在磁碟上只有乙個檔案包含該函式,且只在它調入記憶體時才建立該 dll。

您聽到最多的 api 可能是 windows api,它包括構成 windows 作業系統的各種 dll。每個 windows 應用程式都直接或間接地與 windows api 互動。windows api 保證 windows 下執行的所有應用程式的行為方式一致。

注意 隨著 windows 作業系統的發展,現已發布了幾個版本的 windows api。windows 3.1 使用 win16 api。microsoft? windows nt?、windows 95 和 windows 98 平台使用 microsoft? win32? api。

除 windows api 外,其他一些 api 也已發布。例如,郵件應用程式程式設計介面 (mapi) 是一組可用於編寫電子郵件應用程式的 dll。

api 傳統上是為開發 windows 應用程式的 c 和 c++ 程式設計師編寫的,但其他的程式語言(包括vba)也可以呼叫 dll 中的函式。因為大部分 dll 主要是為 c 和 c++ 程式設計師編寫和整理說明的,所以呼叫 dll 函式的方法與呼叫 vba 函式會有所不同。在使用 api 時必須了解如何給 dll 函式傳遞引數。

警告 呼叫 windows api 和 其他 dll 函式可能會給您的應用程式帶來不良影響。從自己的**中直接呼叫 dll 函式時,您繞過了 vba 通常提供的一些安全機制。如果在定義或呼叫 dll 函式時出現錯誤(所有程式設計師都不可避免),可能會在應用程式中引起應用程式錯誤(也稱為通用性保護錯誤,或 gpf)。最好的解決辦法是在執行**以前儲存該專案,並確保了解 dll 函式呼叫的原理。

lib 建立標準庫、導入庫和匯出檔案,在生成 32 位程式時可將它們與 link 一起使用。lib 從命令提示執行。

可在下列幾種模式下使用 lib:

生成或修改 coff 庫

將成員物件提取到檔案中

建立匯出檔案和導入庫

這些模式是互斥的;每次只能以一種模式使用 lib。

3.動態庫的延遲載入

動態庫的隱示載入 需要標頭檔案 lib檔案 dll檔案 程式執行時dll也要載入到內容 但多個程式使用dll時  記憶體中只用乙份dll

動態庫的顯示載入 只需要dll檔案即可 程式執行時不載入dll 只有在loadlibrary 使用庫函式時才載入dll

動態庫的延遲載入其實是動態庫的隱示載入和顯示載入的合併 需要標頭檔案 lib檔案 dll檔案 只是程式執行時不載入dll,在程式使用時才載入dll,此時的原理與顯示載入的原理一樣。編譯器選項中配置 link>delay load dll一項需要填入載入的動態庫檔案

程式執行時需要知道動態庫的路徑 可以通過setdlldirctrory()可以指定動態庫的路徑

JS非同步載入的三種方式 js載入

一 同步載入 我們平時使用的最多的一種方式。同步模式,又稱阻塞模式,會阻止瀏覽器的後續處理,停止後續的解析,只有當當前載入完成,才能進行下一步操作。所以預設同步執行才是安全的。但這樣如果js中有輸出document內容 修改dom 重定向等行為,就會造成頁面堵塞。所以一般建議把 firefox 3....

VC 動態鏈結庫的顯示載入和隱式載入

最近需要在程式中呼叫dll,因為之前沒呼叫過,對這個不是很清楚,對顯示載入和隱式載入簡單說明一下。兩種方法對於你的程式呼叫動態庫時沒有任何區別,只是你在程式設計時,步驟是不一樣的。顯式呼叫麻煩了點,但可以沒有相應的lib庫 隱式呼叫,使用起來比較簡單,有函式的宣告就可以了,但必須有lib庫。在vc中...

UIWebView的三種載入方式

api提供了三種方法 void loadrequest nsurlrequest request void loadhtmlstring nsstring string baseurl nsurl baseurl void loaddata nsdata data mimetype nsstring...