QT 将enum打包成dll,报link2001,无法解析的外部符号

使用QT的插件系统,定义了某命名空间下的枚举类型,导出为库,然后使用该库,用qDebug打印的时候,报错,如下所示:
image.png

namespace EnumTestNameSpace {
    Q_NAMESPACE
    enum class Test { A = 0x00000001, B, C, D };
    Q_ENUM_NS(Test)
}  // namespace EnumTestNameSpace
EnumTestNameSpace::Test b = EnumTestNameSpace::Test::B;
//qDebug() << b;  // no right link 2001:无法解析的外部符号
qDebug()<<(int)b;// right 强转过来就没问题
qDebug() << (b == EnumTestNameSpace::Test::B);//right 正常进行枚举比较没问题

原因分析:
考虑是因为跨dll了,然后这个地方qt没有进行处理,moc进行编译的时候,qDebug需要使用qmetaobject,找不到就报错了,该问题的影响范围应该是除枚举基本使用外的扩展用法。

解决方法:
1.应用程序直接引用xxx.h,QT会对其进行预编译
2.对于枚举类,需要扩展用法的,使用class进行封装,不要使用namespace

class Enum_EXPORT EnumTestClass : public QObject {
    Q_OBJECT
  public:
    enum class Test { A = 0x00000001, B, C, D };
    Q_ENUM(Test)
};  // namespace EnumTestClass

你可能感兴趣的:(qtenum)