在Qt中,导出类涉及到创建库的时候在类声明前使用宏定义。当其他项目想要使用该库中的类时,这些类就可以被正确地导入和使用。下面是一个简单的示例来展示如何导出一个类:
1. 定义导出宏(在你的库项目中)
#ifndef MYLIBRARY_GLOBAL_H
#define MYLIBRARY_GLOBAL_H
#include <QtCore/qglobal.h>
#if defined(MYLIBRARY_LIBRARY)
# define MYLIBRARYSHARED_EXPORT Q_DECL_EXPORT
#else
# define MYLIBRARYSHARED_EXPORT Q_DECL_IMPORT
#endif
#endif // MYLIBRARY_GLOBAL_H
这里使用了条件编译。当编译库自身的时候,`MYLIBRARY_LIBRARY`应该被定义(通常在项目文件中),这样`MYLIBRARY_EXPORT`就会在类前面扩展为`Q_DECL_EXPORT`,它在Windows上展开为`__declspec(dllexport)`,这是告诉编译器将这个类导出到库中。
当其他项目包含这个头文件时(并且`MYLIBRARY_LIBRARY`没有被定义),`MYLIBRARYSHARED_EXPORT`就会扩展为`Q_DECL_IMPORT`,在Windows上展开为`__declspec(dllimport)`,这是告诉编译器从外部库导入类。
2. 使用导出宏
然后,在你的类定义中使用`MYLIBRARYSHARED_EXPORT`:
#include "mylibrary_global.h"
class MYLIBRARYSHARED_EXPORT MyClass
{
public:
MyClass();
void myFunction();
};
//mylibrary.cpp
MyClass::MyClass()
{
}
void MyClass::myFunction()
{
qDebug()<<QString::fromUtf8("导出类函数被调用!");
}
这样,`MyClass`就会根据`MYLIBRARYSHARED_EXPORT`宏的定义被正确地导出或导入。
3. 在.pro文件中定义宏
在你的库的`.pro`文件中,你需要加入下面这行来定义`MYLIBRARY_LIBRARY`,因此在构建库时`Q_DECL_EXPORT`会生效:
DEFINES += MYLIBRARY_LIBRARY
4. 编译库
并确保产生的`.dll`(Windows)或`.so`(Linux / macOS)文件对应用程序或其他库可用。
5. 使用导出的类,包含头文件并链接对应的库
在另一个项目的.pro文件中:
INCLUDEPATH += $$PWD/include LIBS += -L$$PWD/lib -lMYLIBRARY
#include "mylibrary.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
MyClass myObject;
myObject.myFunction();
return a.exec();
}
运行结果: