Qt/C++ 在使用来自 DLL 的单例时,应用程序在 main() 启动之前卡住
Qt/C++ application stucks before main() starts when using singleton from DLL
我们有一个基于 Qt 的应用程序。
今天我正在努力将一些资源和代码提取到单独的 DLL 中。
当我开始使用 DLL 而不是本地 类 时,我的行为很奇怪:
应用程序甚至在调用 main() 函数之前就卡住了。
有人知道哪里出了问题吗?
我不知道在哪里挖掘,所以不知道这里有什么相关的。
我们正在使用 cmake 3.4 配置项目,Qt 5.4,Visual Studio 2012.
UPDATE. 根据 VS 输出应用程序启动并成功加载所有 dll。所以我可以看到控制台 window,它是空的。
更新 2. @Martin James,几乎是正确的答案。问题出在使用互斥锁的单例初始化中。我不完全明白为什么,但如果在 DLL 加载期间调用它,它会卡在互斥锁上。
更新 3. 在某种程度上它是 C++11 std::mutex in Visual Studio 2012 deadlock when locked from DllMain() 的副本。问问题的时候,锁的原因不明。
尝试使用互斥体显式阻止 DLL 初始化中的多重访问可能会导致死锁,原因为 MS 所知:(
Cannot lock a c++ 11 std::mutex on a DLL
https://connect.microsoft.com/VisualStudio/feedback/details/809005/deadlock-when-locking-std-mutex-during-dllmain-static-initialization
我们有一个基于 Qt 的应用程序。
今天我正在努力将一些资源和代码提取到单独的 DLL 中。
当我开始使用 DLL 而不是本地 类 时,我的行为很奇怪:
应用程序甚至在调用 main() 函数之前就卡住了。
有人知道哪里出了问题吗? 我不知道在哪里挖掘,所以不知道这里有什么相关的。
我们正在使用 cmake 3.4 配置项目,Qt 5.4,Visual Studio 2012.
UPDATE. 根据 VS 输出应用程序启动并成功加载所有 dll。所以我可以看到控制台 window,它是空的。
更新 2. @Martin James,几乎是正确的答案。问题出在使用互斥锁的单例初始化中。我不完全明白为什么,但如果在 DLL 加载期间调用它,它会卡在互斥锁上。
更新 3. 在某种程度上它是 C++11 std::mutex in Visual Studio 2012 deadlock when locked from DllMain() 的副本。问问题的时候,锁的原因不明。
尝试使用互斥体显式阻止 DLL 初始化中的多重访问可能会导致死锁,原因为 MS 所知:(
Cannot lock a c++ 11 std::mutex on a DLL https://connect.microsoft.com/VisualStudio/feedback/details/809005/deadlock-when-locking-std-mutex-during-dllmain-static-initialization