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