使用QT的插件系统,定义了某命名空间下的枚举类型,导出为库,然后使用该库,用qDebug打印的时候,报错,如下所示:
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