关于qt:QT-将enum打包成dll报link2001无法解析的外部符号

2次阅读

共计 659 个字符,预计需要花费 2 分钟才能阅读完成。

应用 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
正文完
 0