日a在线_91精品成人在线_影音先锋成人网站_免费欧洲毛片A级视频_丰满大乳奶水区一区电影

QLibrary基本概念及實例
來源:QT教程     時間:2023-05-05 06:06:36

QLibrary類是在程序運行時加載動態(tài)動態(tài)鏈接庫的。


(相關(guān)資料圖)

可以通過使用構(gòu)造函數(shù)添加需要加載的鏈接庫路徑,或者使用setFileName()函數(shù)設(shè)置路徑。如果是絕對路徑就直接加載,如果是相對路徑QLibrary會在相當(dāng)路徑及所有環(huán)境變量中尋找。

如果都找不到,會通過平臺的不同,去加對應(yīng)的.so或.dll文件。

這個意思就是,當(dāng)在windows上加載lib庫的參數(shù)為demo,那么QLibrary會在后面加.dll。如果是linux就會加.so。

通過調(diào)用load()函數(shù)加載鏈接庫,使用isLoad()函數(shù)去判斷加載是否成功,使用resolve()與load()差不多,但是當(dāng)如果load失敗,將會嘗試再次加載。當(dāng)經(jīng)過一次加載后,鏈接庫將會存儲到內(nèi)存中直到應(yīng)用程序退出。使用unload()函數(shù)解除,如果有多個QLibrary使用了同一個動態(tài)鏈接庫unload()將返回false。直到最后一個QLibrary解除,才會成功。

這里有2個概念:

顯式鏈接:直接在代碼中解析出函數(shù)名,這種方式叫顯式。

隱式鏈接:在程序構(gòu)建過程中參與鏈接過程。

這里有個要注意的此處只能搞C的dll,不能搞c++的dll

這里有2個調(diào)用法:

方法1:

QLibrary myLib(\"mylib\");typedef void (*MyPrototype)();MyPrototype myFunction = (MyPrototype) myLib.resolve(\"mysymbol\");if (myFunction)myFunction();

方法2:

typedef void (*MyPrototype)();MyPrototype myFunction =(MyPrototype) QLibrary::resolve(\"mylib\", \"mysymbol\");if (myFunction)myFunction();

下面是一個例子:

使用MSVC2015編譯的DLL

一個加和一個減的函數(shù):

使用Qt進(jìn)行調(diào)用(這里用WinGW)

Qt代碼如下:

#include #include #include int main(int argc, char *argv[]){QCoreApplication a(argc, argv);QLibrary myLib(\"D:\QtProject\libraryDemo\DLL_C_Demo\");typedef int (*Add)(int a, int b);Add function = (Add)myLib.resolve(\"Add\");if(function){qDebug() << function(10, 20);}qDebug() << \"----------華麗的分割線----------\";typedef int (*Sub)(int a, int b);Sub function2 = (Sub)QLibrary::resolve(\"D:\QtProject\libraryDemo\DLL_C_Demo.dll\", \"Sub\");if(function2){qDebug() << function2(10, 100);}return a.exec();}

兩個程序下載倉庫:

https://github.com/fengfanchen/Qt/tree/master/sharedLibrariesDemo

【領(lǐng) QT開發(fā)教程 學(xué)習(xí)資料, 點擊下方鏈接莬費領(lǐng)取↓↓ ,先碼住不迷路~】

點擊這里:

關(guān)鍵詞:

新聞推薦