大家好!
最近我升级了我的开发环境,从Qt 4.8.4和MSVC 2010迁移到Qt 5.3.1和MSVC 2013。我遇到的问题是我的应用程序在启动时崩溃,堆栈跟踪证明崩溃发生在某些静态类字段初始化期间。
请看以下示例:
// header file
class MyClass : QObject
Q_OBJECT
public:
...
private:
static const QString CLASS_NAME;
// *.cpp file
const QString MyClass::CLASS_NAME = MyClass::tr("FOO"); // crash when calling tr()
const QString MyClass::CLASS_NAME = QObject::tr("FOO"); // but this works normally
在调试Qt期间,我发现
MyClass :: tr()方法最终调用 QMetaObject :: tr()并且似乎 QMetaObject 实例的所有字段都为 NULL 。 然后在引用其中一些时崩溃。
值得注意的是,在另一台安装有Ubuntu 14.04和Qt 5.2.1的机器上无法重现此崩溃。
当然,我可以将 MyClass 名称替换为 QObject 名称,但我的项目由63个库组成,因此我担心可能会出现翻译冲突。