Qt/C++ 应用程序在从 DLL 使用单例时卡在 main() 启动之前

Qt/C++ application stucks before main() starts when using singleton from DLL

本文关键字:main 单例时 启动 C++ 应用程序 DLL Qt      更新时间:2023-10-16

我们有一个基于Qt的应用程序。

今天,我正在将一些资源和代码提取到单独的DLL中。

一旦我开始使用DLL而不是本地类,我就会得到非常奇怪的行为:

应用程序甚至在点击main()函数之前就卡住了。

有没有人知道可能出了什么问题?我不知道在哪里挖掘,所以不知道这里有什么相关。

我们使用cmake 3.4来配置项目,Qt 5.4,Visual Studio 2012。

更新。根据VS输出应用程序启动并成功加载所有dll。所以我可以看到控制台窗口,它是空的。

更新 2. @Martin詹姆斯,几乎是正确的答案。问题出在使用互斥锁的单例初始化中。我不完全明白为什么,但如果在 DLL 加载期间调用它,它会卡在互斥锁上。

更新 3.在某种程度上,当从 DllMain() 锁定时,它是 Visual Studio 2012 死锁中 C++11 std::mutex 的副本。在问这个问题时,锁的原因尚不清楚。

尝试使用互斥锁显式阻止 DLL 初始化中的多次访问可能会导致死锁,原因 MS:(

无法锁定 DLL 上的 c++ 11 std::mutexhttps://connect.microsoft.com/VisualStudio/feedback/details/809005/deadlock-when-locking-std-mutex-during-dllmain-static-initialization