Qt文档阅读笔记-QLibrary基本概念及实例
QLibrary類是在程序運(yùn)行時(shí)加載動態(tài)動態(tài)鏈接庫的。
?
可以通過使用構(gòu)造函數(shù)添加需要加載的鏈接庫路徑,或者使用setFileName()函數(shù)設(shè)置路徑。如果是絕對路徑就直接加載,如果是相對路徑QLibrary會在相當(dāng)路徑及所有環(huán)境變量中尋找。
?
如果都找不到,會通過平臺的不同,去加對應(yīng)的.so或.dll文件。
?
這個(gè)意思就是,當(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ù)解除,如果有多個(gè)QLibrary使用了同一個(gè)動態(tài)鏈接庫unload()將返回false。直到最后一個(gè)QLibrary解除,才會成功。
?
這里有2個(gè)概念:
顯式鏈接:直接在代碼中解析出函數(shù)名,這種方式叫顯式。
隱式鏈接:在程序構(gòu)建過程中參與鏈接過程。
這里有個(gè)要注意的此處只能搞C的dll,不能搞c++的dll
這里有2個(gè)調(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();?
?
?
下面是一個(gè)例子:
使用MSVC2015編譯的DLL
一個(gè)加和一個(gè)減的函數(shù):
使用Qt進(jìn)行調(diào)用(這里用WinGW)
Qt代碼如下:
#include <QCoreApplication> #include <QLibrary> #include <QDebug>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(); }兩個(gè)程序下載倉庫:
https://github.com/fengfanchen/Qt/tree/master/sharedLibrariesDemo
?
?
總結(jié)
以上是生活随笔為你收集整理的Qt文档阅读笔记-QLibrary基本概念及实例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 软考网络工程师笔记-综合知识2
- 下一篇: Qt笔记-AES加密