QLibrary Class Reference(qt加载外部库)
2017-12-05 16:33
387 查看
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 ()
相关文章推荐
- QLibrary Class Reference(qt加载外部库)
- QLibrary Class Reference(qt加载外部库)
- Atitit. 木马病毒的外部class自动加载机制------加载class的方法总结
- qt翻译--QBrush Class Reference(笔刷)
- Qt Style Sheet(六) --- QTextTableCell Class Reference
- Qt 下 QLibrary 动态加载 dll
- Atitit. 木马病毒的外部class自动加载机制------加载class的方法总结
- qt翻译----QVectorIterator Class Reference
- Atitit. 木马病毒的外部class自动加载机制------加载class的方法总结
- 【转】Qt经典出错信息之undefined reference to `vtable for classname'
- Qt Style Sheet(五) --- QTextTable Class Reference
- Qt Style Sheet(六) --- QTextTableCell Class Reference
- QTcpSocket Class Reference翻译
- QT :LNK2019: 无法解析的外部符号 public: class QImage & __thiscall QImage::operator=(class QImage &&)"
- QLibrary 动态加载外部库文件
- QT Creator style sheet(一) 以及加载外部qss方法
- 菜鸟玩qt(10)--- 翻译QSqlError Class Reference
- 详解 Qt 下 QLibrary 动态加载 dll
- Qt中关于undefined reference to `vtable for classname`的问题
- Qt下QLibrary动态加载dll