動態鏈結庫的隱式連線與顯式連線有什麼不同

2021-08-29 21:24:28 字數 1033 閱讀 8573

隱式鏈結是指在**中使用了了庫中的**,只是在鏈結時,鏈結器會把該庫的符號資訊以及匯入函式的資訊寫入到生成的exe檔案的特定的區段中。當該程式載入時,作業系統會根據這個區段中的資訊,來查詢每個它需要的動態庫,並根據這些動態庫的匯出表,與程式中的匯入表相配對,以確定程式中使用的動態庫中的**在什麼位置。這樣應用程式就能夠正確是鏈結到動態庫中的**了。如果在這個過程中,發生了錯誤,比如沒有找到要求的庫檔案,或者庫中沒有你要使用的函式,程式的初始化就會失敗,作業系統就會報錯,並終止該程式的初始化,你的程式就死掉了。

顯式鏈結一般是指在程式執行中,由程式**用loadlibrary和loadlibraryex函式來載入動態庫。這兩個函式僅僅是把庫檔案對映到你的程序位址空間中,並不會查詢你要使用的函式的位址。如果這些函式成功,就會返回庫檔案在你的程序中的映像的基址,隨便你就可以使用這個基址來呼叫getprocaddress()函式來得到你要用的庫中的函式的位址了。如果loadlibrary函式失敗,就會返回null,並不會強制殺死你的應用程式。

兩種方法對於你的程式呼叫動態庫時沒有任何區別,只是你在程式設計時,步驟是不一樣的。顯式呼叫麻煩了點,但可以沒有相應的lib庫;隱式呼叫,使用起來比較簡單,有函式的宣告就可以了,但必須有lib庫。

在vc中兩種方式的具體方法:

一、動態庫的隱示呼叫:

在 vc 工程中直接鏈結靜態輸入庫***.lib,然後即可像呼叫其它原始檔中

的函式一樣呼叫dll中的函式了。

二、動態庫的顯式呼叫:

顯式呼叫動態庫步驟:

1、建立乙個函式指標,其指標資料型別要與呼叫的 dll 引出函式相吻

合。 2、通過 win32 api 函式loadlibrary()顯式的呼叫dll,此函式返回

dll 的例項控制代碼。

3、通過 win32 api 函式getprocaddress()獲取要呼叫的dll 的函式地

址,把結果賦給自定義函式的指標型別。

4、使用函式指標來呼叫 dll 函式。

5、最後呼叫完成後,通過 win32 api 函式freelibrary()釋放dll 函式。

linux下動態鏈結庫的顯式呼叫和隱式呼叫

一 顯式呼叫和隱式呼叫的區別 動態庫相比靜態庫的區別是 靜態庫是編譯時就載入到可執行檔案中的,而動態庫是在程式執行時完成載入的,所以使用動態庫的程式的體積要比使用靜態庫程式的體積小,並且使用動態庫的程式在執行時必須依賴所使用的動態庫檔案 so檔案 而使用靜態庫的程式一旦編譯好,就不再需要依賴的靜態庫...

隱式鏈結無 LIB動態鏈結庫

由於我們經常要呼叫一些第三方廠商或其他編譯器編寫的動態鏈結庫,但是一般都不提供原始檔或.lib檔案,而作為vc隱式鏈結到dll implicitly link to the dll 呼叫,這些卻是必需的。本文將主要討論在沒有原始檔及.lib輸入庫檔案或欲呼叫windows未公開函式的情況下重建.li...

Dll動態鏈結庫建立與隱式鏈結方式使用

windows作業系統誕生以來,dll就作為win作業系統的基礎,通常情況下dll不能直接執行,也無法接收訊息,只能供其他可執行程式或者dll來呼叫,完成某項功能,他的函式只有被呼叫才會發揮作用,windows中有三個重要的dll,他們分別是kernal32.dll,user32.dll,gdi32...