Qt:singleton日志记录类获取不同的实例访问插件和线程

Qt:singleton日志记录类获取不同的实例访问插件和线程,qt,thread-safety,singleton,Qt,Thread Safety,Singleton,我花了几个小时试图理解为什么我的logger类不起作用。 其想法是将现有的qDebug、qWarning和qFatal挂接到我的一个插槽上,并用新的插槽扩展宏列表(本例中为qInfo) 我试图遵循以下准则: 然后,我注册了我的处理程序 int main(int argc, char *argv[]) { QApplication a(argc, argv); // Handle error messages qInstallMsgHandler(MsgHandler:

我花了几个小时试图理解为什么我的logger类不起作用。 其想法是将现有的qDebug、qWarning和qFatal挂接到我的一个插槽上,并用新的插槽扩展宏列表(本例中为qInfo) 我试图遵循以下准则:

然后,我注册了我的处理程序

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    // Handle error messages
    qInstallMsgHandler(MsgHandler::Handler);
}
在主线程中,一切都可以完美地工作。但从运行自己线程的插件来看,它失败了:

void MyPlugin::run()
{
    qWarning("Test debug"); //works fine
    MsgHandler::instance()->Handler(QtInfoMsg, "info 2"); //creates a new instance!
    qInfo("test info"); //also creates a new instance!
}

解决方法是向每个插件传递一个指向MsgHandler的指针。

在链接上的问题中@Naszta给出了正确的答案,但TS实现与此不一致。您应该创建单独的静态链接共享库,而不是静态库。静态库将链接到插件和应用程序两次,但共享库将加载一次。嗯,好的。对于如何创建静态链接的共享库,您有什么提示吗。非常感谢。编辑太迟了:所以我需要编译一个dll而不是库(我正在运行windows),然后在主应用程序和插件中静态链接这个dll?没错。似乎您只需要在singleton项目中将
CONFIG
static
更改为
shared
,并在头文件中正确设置
dllimpot/dllexport
属性。我在moc'ing时遇到此错误:错误C2491:'MsgHandler::staticMetaObject:'dllimport静态数据成员的定义不允许我认为是问题所在我的类是从QObject继承的吗
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    // Handle error messages
    qInstallMsgHandler(MsgHandler::Handler);
}
void MyPlugin::run()
{
    qWarning("Test debug"); //works fine
    MsgHandler::instance()->Handler(QtInfoMsg, "info 2"); //creates a new instance!
    qInfo("test info"); //also creates a new instance!
}