本页内容

QLibrary Class

QLibrary 类在运行时加载共享库。更多内容...

头文件: #include <QLibrary>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core
继承自: QObject

注意:该类中的所有函数均为可重入函数。

公共类型

enum LoadHint { ResolveAllSymbolsHint, ExportExternalSymbolsHint, LoadArchiveMemberHint, PreventUnloadHint, DeepBindHint }
flags LoadHints

属性

公共函数

QLibrary(QObject *parent = nullptr)
QLibrary(const QString &fileName, QObject *parent = nullptr)
QLibrary(const QString &fileName, const QString &version, QObject *parent = nullptr)
QLibrary(const QString &fileName, int verNum, QObject *parent = nullptr)
virtual ~QLibrary()
QString errorString() const
QString fileName() const
bool isLoaded() const
bool load()
QLibrary::LoadHints loadHints() const
QFunctionPointer resolve(const char *symbol)
void setFileName(const QString &fileName)
void setFileNameAndVersion(const QString &fileName, const QString &version)
void setFileNameAndVersion(const QString &fileName, int versionNumber)
void setLoadHints(QLibrary::LoadHints hints)
bool unload()

静态公共成员

bool isLibrary(const QString &fileName)
QFunctionPointer resolve(const QString &fileName, const char *symbol)
QFunctionPointer resolve(const QString &fileName, const QString &version, const char *symbol)
QFunctionPointer resolve(const QString &fileName, int verNum, const char *symbol)

详细说明

QLibrary 对象的实例操作于单个共享对象文件(我们称之为“库”,但也被称为“DLL”)。QLibrary 以平台无关的方式提供对库中功能的访问。 您可以在构造函数中传递文件名,也可以使用setFileName() 显式设置文件名。加载库时,除非文件名是绝对路径,否则 QLibrary 会搜索所有系统特定的库位置(例如 Unix 系统中的LD_LIBRARY_PATH )。

如果文件名是绝对路径,则会首先尝试加载该路径。 如果找不到该文件,QLibrary 会尝试使用不同的平台特定文件前缀(例如 Unix 和 Mac 上的“lib”)和后缀(例如 Unix 上的“.so”、Mac 上的“.dylib”或 Windows 上的“.dll”)来查找该文件。

如果文件路径不是绝对路径,则 QLibrary 会修改搜索顺序,先尝试系统特定的前缀和后缀,然后才是指定的文件路径。

这使得可以仅通过基名(即不带后缀)来指定共享库,因此相同的代码可以在不同的操作系统上运行,同时仍能最大限度地减少查找库的尝试次数。

最重要的函数包括:load()(用于动态加载库文件)、isLoaded()(用于检查加载是否成功)以及resolve()(用于解析库中的符号)。resolve() 函数会在库尚未加载时隐式尝试加载该库。 可以使用多个 QLibrary 实例来访问同一个物理库。库一旦被加载,就会一直驻留在内存中,直到应用程序终止。您可以尝试使用unload() 卸载库,但如果其他 QLibrary 实例正在使用该库,则该调用将失败;只有当所有实例都已调用unload() 之后,才会发生卸载。

QLibrary 的典型用法是解析库中导出的符号,并调用该符号所代表的 C 函数。这被称为“显式链接”,与“隐式链接”相对,后者是在构建过程中将可执行文件与库进行链接时,由链接步骤自动完成的。

以下代码片段加载了一个库,解析符号“mysymbol”,并在一切成功时调用该函数。如果出现错误(例如库文件不存在或符号未定义),函数指针将被设置为nullptr ,且该函数不会被调用。

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

为了使resolve()正常工作,该符号必须作为C函数从库中导出。这意味着,如果库是使用C++编译器编译的,则该函数必须被包裹在extern "C" 代码块中。 在 Windows 系统上,这还要求使用dllexport 宏;有关具体实现方法的详细信息,请参阅resolve()。为方便起见,提供了一个静态函数resolve(),如果您只想调用库中的函数而无需先显式加载该库,可以使用该函数:

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

另请参阅 QPluginLoader 。

成员类型文档

enum QLibrary::LoadHint
flags QLibrary::LoadHints

该枚举描述了在加载库时可用于更改库处理方式的可能提示。这些值指示了加载库时符号的解析方式,并通过setLoadHints()函数进行指定。

常量值描述
QLibrary::ResolveAllSymbolsHint0x01导致库在加载时解析其中的所有符号,而不仅仅是在调用resolve() 时才进行解析。
QLibrary::ExportExternalSymbolsHint0x02导出库中未解析和外部符号,以便它们能在随后加载的其他动态库中得到解析。
QLibrary::LoadArchiveMemberHint0x04允许库的文件名指定归档文件中的特定对象文件。如果给出了此提示,则库的文件名由一个路径(即对归档文件的引用)和后跟的归档成员引用组成。
QLibrary::PreventUnloadHint0x08防止在调用 close() 时将库从地址空间中卸载。如果稍后调用 open(),则该库的静态变量不会被重新初始化。
QLibrary::DeepBindHint0x10指示链接器在解析已加载库中的外部符号时,优先使用已加载库中的定义,而非加载应用程序中导出的定义。此选项仅在 Linux 上受支持。

LoadHints 类型是QFlags<LoadHint> 的 typedef。它存储了 LoadHint 值的按“或”运算组合。

另请参阅 loadHints 。

属性文档

fileName : QString

该属性存储库的文件名

我们建议在文件名中省略文件后缀,因为QLibrary 会自动查找带有相应后缀的文件(参见isLibrary())。

加载库时,除非文件名包含绝对路径,否则QLibrary 会在所有系统特有的库位置(例如 Unix 系统上的LD_LIBRARY_PATH )中进行搜索。成功加载库后,fileName() 会返回该库的完全限定文件名,包括在构造函数中指定或通过 setFileName() 传递的库的完整路径。

例如,在 Unix 平台上成功加载“GL”库后,fileName() 将返回“libGL.so”。如果最初传递的文件名为“/usr/lib/libGL”,则 fileName() 将返回“/usr/lib/libGL.so”。

访问函数:

QString fileName() const
void setFileName(const QString &fileName)

loadHints : LoadHints

为load()函数提供一些关于其行为方式的提示。

您可以为符号的解析方式提供一些提示。通常,符号不会在加载时解析,而是采用懒加载方式(即在调用resolve() 时才进行解析)。如果您将 loadHints 设置为ResolveAllSymbolsHint ,那么在平台支持的情况下,所有符号都将在加载时进行解析。

设置 `ExportExternalSymbolsHint ` 将使库中的外部符号可在后续加载的库中进行解析。

如果设置了 `LoadArchiveMemberHint `,文件名由两个部分组成:第一部分是指向归档文件的路径,第二部分是指向归档成员的引用。例如,fileName libGL.a(shr_64.o) 将指向位于名为libGL.a 的归档文件中的库shr_64.o 。此功能仅在 AIX 平台上受支持。

加载提示的解释取决于平台,如果您使用它,很可能已经对目标编译平台做了一些假设,因此请仅在您理解其后果的情况下使用它们。

默认情况下,这些标志均未设置,因此库将采用延迟符号解析方式加载,且不会导出供其他动态加载库解析的外部符号。

注意: 只有当该对象未与任何文件关联时,才能清除提示 。只有在设置了文件名后才能添加提示(hints 将与旧提示进行或运算)。

注意: 在库加载后设置 此属性将无效,且 loadHints() 不会反映这些更改。

注意:此 属性由所有引用同一库的QLibrary 实例共享。

访问函数:

QLibrary::LoadHints loadHints() const
void setLoadHints(QLibrary::LoadHints hints)

成员函数文档

[explicit] QLibrary::QLibrary(QObject *parent = nullptr)

使用给定的parent 构建一个库。

[explicit] QLibrary::QLibrary(const QString &fileName, QObject *parent = nullptr)

使用给定的parent 构建一个库对象,该对象将加载由fileName 指定的库。

建议在fileName 中省略文件后缀,因为QLibrary会根据平台自动查找具有相应后缀的文件,例如在Unix系统上为“.so”,在macOS和iOS系统上为“.dylib”,在Windows系统上为“.dll”。(参见fileName 。)

[explicit] QLibrary::QLibrary(const QString &fileName, const QString &version, QObject *parent = nullptr)

根据给定的parent 构建一个库对象,该对象将加载由fileName 指定的库,并采用完整版本号version 。目前,在Windows系统上会忽略版本号。

建议在fileName 中省略文件后缀,因为QLibrary会根据平台自动查找具有相应后缀的文件,例如在Unix系统上为“.so”,在macOS和iOS系统上为“.dylib”,在Windows系统上为“.dll”。(参见fileName 。)

[explicit] QLibrary::QLibrary(const QString &fileName, int verNum, QObject *parent = nullptr)

根据给定的parent 构建一个库对象,该对象将加载由fileName 指定的库,其主版本号为verNum 。目前,在Windows系统上会忽略版本号。

建议在fileName 中省略文件后缀,因为QLibrary会根据平台自动查找具有相应后缀的文件,例如在Unix系统上为“.so”,在macOS和iOS系统上为“.dylib”,在Windows系统上为“.dll”。(参见fileName 。)

[virtual noexcept] QLibrary::~QLibrary()

销毁QLibrary 对象。

除非显式调用了unload(),否则该库将一直驻留在内存中,直至应用程序终止。

另请参阅 isLoaded() 和unload()。

QString QLibrary::errorString() const

返回一个文本字符串,其中包含最近发生的错误的描述。目前,只有当load()、unload() 或resolve() 因某种原因失败时,errorString 才会被设置。

[static] bool QLibrary::isLibrary(const QString &fileName)

如果 `fileName ` 包含可加载库的有效后缀,则返回 `true `;否则返回 `false`。

平台有效后缀
Windows.dll、.DLL
Unix/Linux.so
AIX.a
HP-UX.sl、.so (HP-UXi)
macOS 和 iOS.dylib、.bundle 、.so

Unix 系统中尾部的版本号将被忽略。

bool QLibrary::isLoaded() const

如果load()调用成功,则返回true ;否则返回false 。

注意:在 Qt 6.6之前, 即使未调用load(),如果同一库中的另一个QLibrary 对象导致该库被加载,此函数仍会返回true 。

另请参阅 load()。

bool QLibrary::load()

加载库,如果加载成功则返回true ;否则返回false 。由于resolve()在解析任何符号之前都会调用此函数,因此无需显式调用它。在某些情况下,您可能希望预先加载该库,此时可使用此函数。

另请参阅 unload()。

QFunctionPointer QLibrary::resolve(const char *symbol)

返回导出符号symbol 的地址。如有必要,将加载该库。如果无法解析该符号或无法加载该库,该函数将返回nullptr 。

示例:

typedef int (*AvgFunction)(int, int);

AvgFunction avg = (AvgFunction) library->resolve("avg");
if (avg)
    return avg(5, 8);
else
    return -1;

该符号必须作为 C 函数从库中导出。这意味着,如果库是使用 C++ 编译器编译的,则该函数必须封装在 `extern "C" ` 中。在 Windows 系统上,还必须使用 `__declspec(dllexport) ` 编译器指令从 DLL 中显式导出该函数,例如:

extern "C" MY_EXPORT int avg(int a, int b)
{
    return (a + b) / 2;
}

其中MY_EXPORT 定义为

#ifdef Q_OS_WIN
#define MY_EXPORT __declspec(dllexport)
#else
#define MY_EXPORT
#endif

[static] QFunctionPointer QLibrary::resolve(const QString &fileName, const char *symbol)

加载库fileName ,并返回导出符号symbol 的地址。请注意,fileName 中不应包含平台特定的文件后缀;(参见fileName )。该库将保持加载状态,直至应用程序退出。

如果无法解析该符号,或者无法加载该库,该函数将返回nullptr 。

这是一个重载函数。

另请参阅 resolve()。

[static] QFunctionPointer QLibrary::resolve(const QString &fileName, const QString &version, const char *symbol)

加载库fileName (完整版本号为version ),并返回导出符号symbol 的地址。请注意,fileName 不应包含平台特有的文件后缀;(参见fileName )。该库将保持加载状态,直至应用程序退出。在Windows系统上,version 将被忽略。

如果无法解析该符号或无法加载该库,该函数将返回nullptr 。

这是一个重载函数。

另请参见 resolve()。

[static] QFunctionPointer QLibrary::resolve(const QString &fileName, int verNum, const char *symbol)

加载主版本号为verNum 的库fileName ,并返回导出符号symbol 的地址。请注意,fileName 不应包含平台特有的文件后缀;(参见fileName )。该库将保持加载状态,直至应用程序退出。在Windows系统上,verNum 将被忽略。

如果无法解析该符号或无法加载该库,该函数将返回nullptr 。

这是一个重载函数。

另请参阅 resolve()。

void QLibrary::setFileNameAndVersion(const QString &fileName, const QString &version)

将fileName 属性与完整版本号分别设置为fileName 和version 。在Windows系统上,version 参数将被忽略。

另请参阅 setFileName()。

void QLibrary::setFileNameAndVersion(const QString &fileName, int versionNumber)

将fileName 属性与主版本号分别设置为fileName 和versionNumber 。在Windows系统上,versionNumber 将被忽略。

另请参阅 setFileName()。

bool QLibrary::unload()

卸载库,如果库能被卸载,则返回true ;否则返回false 。

应用程序终止时会自动执行此操作,因此通常无需调用此函数。

如果其他 `QLibrary ` 实例正在使用同一库,则调用将失败,只有当所有实例都已调用 `unload()` 后,才会发生卸载。

请注意,在 macOS 上,动态库无法被卸载。QLibrary::unload() 将返回true ,但该库仍将保持加载在进程中。

另请参阅 resolve() 和load()。

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.