创建共享库
以下各节列出了在创建共享库时应考虑的某些事项。
使用共享库中的符号
共享库中包含的符号(函数、变量或类),如果打算供客户端(如应用程序或其他库)使用,则必须以特殊方式进行标记。这些符号被称为公共符号,即被导出或公开可见的符号。
其余符号不应对外可见。在大多数平台上,编译器会默认隐藏它们。在某些平台上,则需要使用特殊的编译器选项来隐藏这些符号。
编译共享库时,必须将其标记为导出。若要在客户端使用该共享库,某些平台可能还要求进行特殊的导入声明。
根据您的目标平台,Qt 提供了包含必要定义的特殊宏:
- Q_DECL_EXPORT 在编译共享库时,必须将该宏添加到所用符号的声明中。
- Q_DECL_IMPORT 必须添加到编译使用该共享库的客户端时所用符号的声明中。
现在,我们需要确保调用正确的宏——无论是编译共享库本身,还是仅编译使用该共享库的客户端。通常,这可以通过添加一个特殊的头文件来解决。
假设我们要创建一个名为mysharedlib 的共享库。该库的专用头文件mysharedlib_global.h 如下所示:
#include <QtCore/QtGlobal>
#if defined(MYSHAREDLIB_LIBRARY)
# define MYSHAREDLIB_EXPORT Q_DECL_EXPORT
#else
# define MYSHAREDLIB_EXPORT Q_DECL_IMPORT
#endif在该库的每个头文件中,我们需指定以下内容:
#include "mysharedlib_global.h"
MYSHAREDLIB_EXPORT void foo();
class MYSHAREDLIB_EXPORT MyClass...然后,我们需要确保在构建共享库本身时,编译器已定义MYSHAREDLIB_LIBRARY 。这需要在库的构建系统中完成。如果使用CMake,则需扩展共享库的目标:
target_compile_definitions(mysharedlib PRIVATE MYSHAREDLIB_LIBRARY)如果使用qmake,则向共享库的 xml-ph-0000@deepl.internal 文件中添加
DEFINES += MYSHAREDLIB_LIBRARY到共享库的.pro 文件中。
注意: 在 Qt Creator 和 Qt VS Tools 中的库向导会为您提供一个已配置好这些设置的模板。
头文件的注意事项
通常,客户端只会包含共享库的公共头文件。这些库在部署时可能安装在不同的位置。因此,必须排除在构建共享库时使用的其他内部头文件。
例如,该库可能提供一个类,该类封装了一个硬件设备,并包含由某个第三方库提供的该设备的句柄:
#include <footronics/device.h>
class MyDevice {
private:
FOOTRONICS_DEVICE_HANDLE handle;
};在使用聚合或多重继承时,由Qt Widgets Designer 创建的表单也会出现类似情况:
#include "ui_widget.h"
class MyWidget : public QWidget {
private:
Ui::MyWidget m_ui;
};在部署库时,不应依赖内部头文件footronics/device.h 或ui_widget.h 。
可通过采用各类 C++ 编程书籍中描述的“指向实现的指针”设计模式来避免此问题。对于具有值语义的类,建议使用QSharedDataPointer 。
二进制兼容性
对于加载共享库的客户端,为了正常工作,所用类的内存布局必须与编译客户端时所用库版本的内存布局完全一致。换言之,客户端在运行时找到的库必须与编译时使用的版本二进制兼容。
如果客户端是一个自包含的软件包,并随附了所需的所有库,这通常不会成为问题。
然而,如果客户端应用程序依赖于属于另一个安装包或操作系统的共享库,那么我们就需要为共享库设计一个版本控制方案,并决定应在哪个层级保持二进制兼容性。例如,相同主版本号的 Qt 库被保证具有二进制兼容性。
保持二进制兼容性会对您对类所做的更改施加一些限制。关于这一点的详细说明,请参阅KDE - 政策/C++ 的二进制兼容性问题。这些问题应在库设计之初就予以考虑。我们建议尽可能采用“信息隐藏”原则和“指向实现的指针”技术。
© 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.