程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 動態鏈接庫加載方法

動態鏈接庫加載方法

編輯:關於C語言

   時間久了的東西老是喜歡忘記,然後又要到網上去查找,網上一寫就是一堆,還是要自己記錄下才行,今天把動態鏈接庫簡單說明下。

   首先,庫分為靜態庫和動態庫。

       1.靜態鏈接時會把裡面的函數加載到exe文件中,等程序發布時就不需要DLL文件了。程序生成一個.lib文件。

       2.而動態鏈接稱為運行時調用,就是到用的時候才把函數載入進來,而且是在內存中共享的,不會把DLL中的代碼鏈接時加入到程序裡,所以程序發布時還要帶載入過的DLL文件,但這樣是有好處的,易於擴展,便於二次開發。程序生成一個.lib文件和一個.dll文件。

       總結:我們發現,無論是靜態鏈接庫還是動態鏈接庫,最後都有lib文件,那麼兩者區別是什麼呢?其實,兩個是完全不一樣的東西。靜態庫對應的lib文件叫靜態庫,動態庫對應的lib文件叫導入庫。實際上靜態庫本身就包含了實際執行代碼、符號表等,而對於導入庫而言,其實際的執行代碼位於動態庫中,導入庫只包含了地址符號表等,以確保程序找到對應函數的一些基本地址信息。在動態庫裡,實際開發中,用的很多第三方擴展庫,別人一般都提供的:.h文件類,函數的聲明),.dll 文件類或函數的實現),.lib 文件導入庫),也可以不提供lib文件,這樣的話就需要一個函數指針。

   然後,動態鏈接庫加載的方式分為顯式鏈接和隱式鏈接。

       1.隱式調用比較簡單,但需要有導入庫,也就是.lib文件,然後加入一句pragma comment(lib,"xxx.lib")。 或者在VC中的set選項中,直接加入你的XXX.lib,注意,dll文件需要在當前工程目錄中,不然編譯好像沒錯,運行就會出錯。

       2.而顯示調用雖然比較麻煩,但免去了.lib文件,需要用的時候直接loadLibrary,然後聲明指向的指針,最後用完之後在FreeLibrary就行了,雖然比較麻煩,某些時候比隱式鏈接具有更大的靈活性,比如,如果在運行時發現DLL無法找到,程序可以顯示一個錯誤信息並能繼續運行,當你想為你的程序提供插件服務時,顯式鏈接也很有用處。

       HMOUDLU hinst = LoadLibrary("XXX.dll");

       typedef int (*ADDPROC)(int,int);

       ADDPROC add = (ADDPROC)GetProcAddress(hinst,"add");

       printf("%d",add(2,3));

       FreeLibrary(hinst);

   這二個就是加載方式的區別。

   好了,其它也沒有什麼,放個最簡單的例子在這吧,結合著看一下,動態連接庫其實你們就懂了,沒有什麼其它的東西,超級簡單,HOHO。

extern "C" declspec(dllexport) int add(int a,int b)

{

   return a+b;

}


看了上面的理論,來個超簡單的簡結步驟:

1. 靜態庫包括.lib和.h文件,在工程中使用靜態庫分為3步:

(1)包含lib文件,pragma comment();

   (2)在工程中包括.h文件;

   (3)工程中使用靜態庫中的函數;

2.動態鏈接庫一般包括.lib(導出函數),.h,.dll文件,使用動態庫有兩種情況:

(1)隱式鏈接,同使用靜態庫相似,分為三步:引用.lib,包含頭文件,使用導出函數;

(2)動態加載,直接使用LoadLibrary 加載所需的動態庫,然後指定所需的導出函數,效率最高!


本文出自 “西邊太陽” 博客,請務必保留此出處http://thgenius.blog.51cto.com/1042803/1270837

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved