前言
在程序編碼時,經常會用到動態庫(DLL),比如分享自己的寫的功能代碼或者使用第三方的插件時。之前我只會最常用的加載方式(靜態加載),後來在項目中要求動態加載,才學會了動態加載的方式。但是爲什麼要用不同的加載動態庫方式呢?接下來,我們一起來探索它的答案。
兩種方式介紹
1.傳統常用的方式(靜態加載)
靜態調用前提是在編譯之前已經明確知道調用DLL中的哪些函數,需要lib和相應的導入頭文件*.h。編譯時,在目標文件中只保留必要的鏈接信息,而不含DLL函數的代碼;當程序執行時,利用鏈接信息加載DLL函數代碼並在內存中將其連接入調用程序的執行空間中,其主要目的是便於代碼共享。
平時,在龐大的項目中,我們需要配合工作將一些公用的功能封成dll,爲了便於大家的使用。一般功能比較複雜的dll,通常使用靜態加載的方式,一般情況下,dll的頭文件都會寫清楚暴露的函數說明,這樣便於對功能的理解和代碼的共享。
至於Qt Creator和VS靜態加載動態庫(dll)的配置,我這裏就不贅述了,網上有很多,下面我提供了網友的教程的鏈接,便於懶癌患者的使用。
Qt Creator和VS的配置:https://blog.csdn.net/u013554213/article/details/79644916
2.動態加載(QLibrary)
動態調用主要通過API函數(Window LoadLibrary、GetProcAddress、FressLibrary)來調用程序運行後需要的DLL函數,節省內存空間。QT中,則主要通過QLibrary進行動態加載(適用於跨平臺)。
一般dll功能相較簡單、比較好理解、較小時,通常使用動態加載的方式,這種方式只需要將dll放到運行目錄下,或者固定路徑下,其他就不需配置了。下面我介紹一下兩種方式
Qt方式加載:
用Qt的方式,主要用到類QLibrary,它在運行時加載共享庫,具體代碼如下
QLibrary myLib("mylib");
//構造函數加載路徑下的dll或者使用setFileName函數來加載路徑下的dll
// myLib.setFileName("mylib");
//判斷是否加載成功
if(myLib.load())
{
//創建函數指針與需加載的函數對應 typedef 返回值 (*函數指針名)(入參)
typedef void (*MyPrototype)();
MyPrototype myFunction = (MyPrototype) myLib.resolve("mysymbol");
if (myFunction)
myFunction();
//如果後續不再需要使用dll,則需要釋放
myLib.unload();
}
純C++(windows)方式加載:
typedef void (*MyPrototype)();
HINSTANCE hDLL;//DLL句柄
MyPrototype myFunction;//函數指針
hDLL = LoadLibrary(TEXT("mylib"));
if(hDLL)
{
myFunction = (MyPrototype)GetProcAddress(hDLL, TEXT("mysymbol"));
if (myFunction)
myFunction();
FreeLibrary(hDLL);
}
結束語
差不多就到這裏吧,最常用的dll,拜拜了~