QLibrary Class Reference(qt加载外部库)
生活随笔
收集整理的這篇文章主要介紹了
QLibrary Class Reference(qt加载外部库)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
QLibrary Class Reference
[QtCore module]
該類加載分享的庫(kù)在運(yùn)行時(shí)。
#include <QLibrary>
繼承QObject
注意:所有函數(shù)是可重入的
公共類型:
enum?LoadHint { ResolveAllSymbolsHint, ExportExternalSymbolsHint, LoadArchiveMemberHint }
flags?LoadHints
屬性:
??fileName : QString
??loadHints : LoadHints
公共函數(shù):
QLibrary ( QObject * parent = 0 )
?QLibrary ( const QString & fileName, QObject * parent = 0 )
?QLibrary ( const QString & fileName, int verNum, QObject * parent = 0 )
?QLibrary ( const QString & fileName, const QString & version, QObject * parent = 0 )
?~QLibrary ()
QString?errorString () const
QString?fileName () const
bool?isLoaded () const
bool?load ()
LoadHints?loadHints () const
void *?resolve ( const char * symbol )
void?setFileName ( const QString & fileName )
void?setFileNameAndVersion ( const QString & fileName, int versionNumber )
void?setFileNameAndVersion ( const QString & fileName, const QString & version )
void?setLoadHints ( LoadHints hints )
bool?unload ()
靜態(tài)公共成員:
bool?isLibrary ( const QString & fileName )
void *?resolve ( const QString & fileName, const char * symbol )
void *?resolve ( const QString & fileName, int verNum, const char * symbol )
void *?resolve ( const QString & fileName, const QString & version, const char * symbol )
詳細(xì)描述:
一個(gè)QLibrary對(duì)象的實(shí)例操作一個(gè)單獨(dú)的共享的庫(kù),我們稱它為lib或者dll。一個(gè)QLibrary提供一種平臺(tái)獨(dú)立的方式進(jìn)入到共享庫(kù)里的函數(shù)。你能傳一個(gè)文件名在構(gòu)造器,或者明確地設(shè)置它使用setFileName()。當(dāng)加載庫(kù)時(shí),QLibrary搜索在所有特別的系統(tǒng)庫(kù)路徑,除非文件名有一個(gè)絕對(duì)路徑。如果文件不能被找到,QLibrary試著修改名字用不同平臺(tái)的后綴,像“so”在unix上,“dylib”在mac,或者“dll”在windows和symbian上。這樣只通過共享庫(kù)的名字就能找到他們,所以相同的代碼將要工作在不同的平臺(tái)上。
最重要的函數(shù)load(),動(dòng)態(tài)的加載庫(kù)文件。isLoaded()來檢查是否加載時(shí)成功的,resolve()來分解一個(gè)庫(kù)里的對(duì)象。如果庫(kù)還沒有被加載,Resolve()函數(shù)將暗中的加載庫(kù)。QLibrary的多重實(shí)例,能被用來進(jìn)入相同的庫(kù)。一旦被加載,庫(kù)將保存在記憶中,直到應(yīng)用終止。你能試著卸載一個(gè)庫(kù)使用unload(),但是如果其他的實(shí)例正在使用相同的庫(kù),這個(gè)函數(shù)將失敗,卸載成功將只發(fā)生在所有的實(shí)例都調(diào)用unload()。
一個(gè)典型的應(yīng)用QLibrary是分解一個(gè)輸出符號(hào),來調(diào)用這個(gè)符號(hào)代表的c函數(shù)。這叫做“顯示連接”(explicit linking)區(qū)別于“隱式連接“(implicit linking)。
注意:在symbian,只有當(dāng)庫(kù)時(shí)建立作為STDDLL,可以是使用他們的名字倆分解符號(hào)。否則序號(hào)必須被使用。在symbian,庫(kù)的路徑被忽略,總是使用系統(tǒng)缺省的庫(kù)路徑。
下面的代碼片段的加載一個(gè)庫(kù),分解符號(hào)“mysymbol“,調(diào)用函數(shù)如果每一件事成功。如果有錯(cuò)誤,庫(kù)文件不存在或者符號(hào)沒有定義,函數(shù)指針將是0,并且不被調(diào)用。
QLibrary myLib("mylib");
?typedef void (*MyPrototype)();
?MyPrototype myFunction = (MyPrototype) myLib.resolve("mysymbol");
?if (myFunction)
???? myFunction();
這個(gè)符號(hào)不需被輸出作為一個(gè)c函數(shù),為resolve()來工作。這意味著函數(shù)將被包裹在一個(gè)外部的“c“塊中,如果庫(kù)是使用一個(gè)c++編譯器編譯。在windows上,這將要求一個(gè)dllexport宏的使用。看resolve()來了解他是怎樣工作的。為了方便起見,有一個(gè)靜態(tài)的resolve()函數(shù),你能使用它,如果你只想調(diào)用一個(gè)函數(shù)而不明確的加載庫(kù)。
typedef void (*MyPrototype)();
?MyPrototype myFunction =
???????? (MyPrototype) QLibrary::resolve("mylib", "mysymbol");
?if (myFunction)
???? myFunction();
成員函數(shù)文件:
enum QLibrary::LoadHint
flags QLibrary::LoadHints
這個(gè)聯(lián)合描述可能的暗示,當(dāng)庫(kù)被加載時(shí),能被用來改變被處理的庫(kù)的方式。這些值表明當(dāng)庫(kù)被加載時(shí),符號(hào)是怎樣被分解的,被指明通過使用setLoadHints()。
內(nèi)容?????值??????描述
QLibrary::ResolveAllSymbolsHint?0x01?當(dāng)庫(kù)被加載時(shí)所有的符號(hào)被分解,不是當(dāng)調(diào)用resolve時(shí)才分解。
QLibrary::ExportExternalSymbolsHint?0x02?輸出未分解的或者全局的符號(hào),以至于他們能被分解在以后其他的動(dòng)態(tài)加載發(fā)生時(shí)。
QLibrary::LoadArchiveMemberHint?0x04?允許庫(kù)的文件名來署名一個(gè)特別的對(duì)象文件在一個(gè)檔案文件內(nèi)。如果這個(gè)暗示被給,庫(kù)的文件名包含一個(gè)路徑,他是一個(gè)檔案文件的路徑,緊跟著一個(gè)檔案成員,。
LoadHints類型是一個(gè)為QFlags的類型定義。它存儲(chǔ)一個(gè)or聯(lián)合LoadHint值。
屬性文件:
fileName : QString
這個(gè)屬性擁有庫(kù)的文件名字。
我們推薦省略文件的后綴,因?yàn)镼Library將自動(dòng)查找文件使用最佳的后綴。
當(dāng)加載庫(kù)時(shí),QLibrary搜索在所有特別的系統(tǒng)庫(kù)路徑。
例如,在成功加載unix平臺(tái)的“GL“庫(kù)后,fileName()將返回”libGL.so“.如果文件名是”/usr/lib/libGL”,fileName()將返回”/usr/lib/libGL.so”
注意:在symbian,文件名的路徑是被忽略的。
通道函數(shù):
QString?fileName () const
void?setFileName ( const QString & fileName )
loadHints:LoadHints
這個(gè)屬性告訴load()函數(shù)一些暗示來怎樣加載。
你可以給一些暗示在符號(hào)怎樣分解。通常,符號(hào)不能被分解在加載時(shí),而是當(dāng)resolve()調(diào)用時(shí)才分解。你可以設(shè)置ResolveAllSymbolsHint屬性,如果平臺(tái)支持,他將在加載時(shí)被分解。
設(shè)置ExportExternalSymbolsHint將使全局的符號(hào)在加載時(shí)被分解。
如果LoadArchiveMemberHint被設(shè)置,文件名將有兩部分組成。一個(gè)路徑,它代表一個(gè)檔案文件,緊跟著檔案成員。例如文件名libGL.a(shr_64.o)將表示庫(kù)shr_64.o是libGL.a的成員。這只支持在AIX平臺(tái)
加載暗示是平臺(tái)獨(dú)立的。如果你使用它,你可能需要根據(jù)平臺(tái),預(yù)設(shè)一些條件。
缺省的,這些標(biāo)志都沒有被設(shè)置。所以庫(kù)將被加載使用懶惰的信號(hào)分解,將不輸出全局符號(hào)為其他動(dòng)態(tài)加載庫(kù)。
通道函數(shù):
LoadHints?loadHints () const
void?setLoadHints ( LoadHints hints )
成員函數(shù)文件;
QLibrary::QLibrary ( QObject * parent = 0 )
QLibrary::QLibrary ( const QString & fileName, QObject * parent = 0 )
構(gòu)建一個(gè)庫(kù)對(duì)像,使用一個(gè)被給的parent,和文件名
我們推薦忽略文件名的后綴。
QLibrary::QLibrary ( const QString & fileName, int verNum, QObject * parent = 0 )
目前(主版本號(hào))verNum在window和symbian被忽略。
QLibrary::QLibrary ( const QString & fileName, const QString & version, QObject * parent = 0 )
目前(全版本號(hào))version在window和symbian被忽略。
QLibrary::~QLibrary ()
QString QLibrary::errorString () const
bool QLibrary::isLibrary ( const QString & fileName )?? [static]
Platform?Valid suffixes
Windows?.dll
Unix/Linux?.so
AIX?.a
HP-UX?.sl, .so (HP-UXi)
Mac OS X?.dylib, .bundle, .so
bool QLibrary::isLoaded () const
bool QLibrary::load ()
因?yàn)閞esolve()總是先調(diào)用這個(gè)函數(shù),在分解符號(hào)。所以不必明確的調(diào)用它。當(dāng)你想高級(jí)的加載庫(kù),你可以使用這個(gè)函數(shù)。
void * QLibrary::resolve ( const char * symbol )
返回輸出符號(hào)symbol的地址。
typedef int (*AvgFunction)(int, int);
?AvgFunction avg = (AvgFunction) library->resolve("avg");
?if (avg)
???? return avg(5, 8);
?else
???? return -1;
在window你必須明確的輸出函數(shù)從DLL,使用_declspec(dllexport)編譯
extern "C" MY_EXPORT int avg(int a, int b)
?{
???? return (a + b) / 2;
?}
#ifdef Q_WS_WIN
?#define MY_EXPORT __declspec(dllexport)
?#else
?#define MY_EXPORT
?#endif
void * QLibrary::resolve ( const QString & fileName, const char * symbol )?? [static]
void * QLibrary::resolve ( const QString & fileName, int verNum, const char * symbol )?? [static]
void * QLibrary::resolve ( const QString & fileName, const QString & version, const char * symbol )?? [static]
void QLibrary::setFileNameAndVersion ( const QString & fileName, int versionNumber )
void QLibrary::setFileNameAndVersion ( const QString & fileName, const QString & version )
bool QLibrary::unload ()
?
轉(zhuǎn)載于:https://blog.51cto.com/no001/282536
總結(jié)
以上是生活随笔為你收集整理的QLibrary Class Reference(qt加载外部库)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MCSE第三课
- 下一篇: nagios学习笔记(一)