1

我正在使用 Qt 5.0.2 提供的 MinGW-builds 工具链来构建项目。总的来说,事情进展顺利,但我似乎遇到了障碍。当 Beta 测试人员在他的 Windows XP 机器上运行该程序时,该程序立即崩溃并出现以下错误:

XP 崩溃对话框

我使用Dependency Walker探索了一下,发现了两件事:

  1. 当 MinGW 的 C++ 运行时链接到 msvcrt.dll 时,会涉及到它:
    链接路径

  2. 令人惊讶的是,他的计算机(以及办公室中的其他几台计算机)的 msvcrt.dll(Windows C 运行时库)版本太旧了,以至于它们缺少所有“安全”CRT 添加(MinGW 的 C++ 运行时显然使用了)。

安装 Qt 提供的 Visual C++ 运行时 (in Qt\Qt5.0.2\vcredist) 并不能解决问题,因为更新版本的运行时(例如 Qt 使用的那个)提供了不同的文件(例如 VS11 的 msvcp110.dll 和 msvcr110.dll)而不是替换旧的一。

有什么解决方法吗?似乎所有版本的 MinGW 都链接到这个文件,我真的不想切换到 Visual Studio 2010(Qt 5 提供的另一个选项),因为它对 C++11 的支持很差。最初的想法是让安装程序将旧的 msvcrt.dll 替换为新的,但是

  1. 许多程序都在积极使用运行时(想象一下),所以它不能被覆盖。

  2. 对于一个用户空间应用程序的安装程序来说,进入C:\Windows\System32并开始替换文件听起来非常邪恶。

4

1 回答 1

3

该副本libstdc++-6.dll与预构建的 Qt 5.0.2(带有 MinGW)包 ( qt-windows-opensource-5.0.2-mingw47_32-x86-offline.exe) 一起安装,不会memmove_smsvcrt.dll.

libstdc++-6.dll这是 Qt 5.0.2 和 MinGW 包安装的各种版本的名称中带有“memmove”的所有导入的转储:

C:\qt\5.0.2>for /f "usebackq" %a in (`dir libstdc++-6.dll /s/b`) do dumpbin /imports %a | grep memmove

C:\qt\5.0.2>dumpbin /imports C:\qt\5.0.2\5.0.2\mingw47_32\bin\libstdc++-6.dll | grep memmove
                  418 memmove

C:\qt\5.0.2>dumpbin /imports C:\qt\5.0.2\Tools\MinGW\bin\libstdc++-6.dll   | grep memmove
                  418 memmove

C:\qt\5.0.2>dumpbin /imports C:\qt\5.0.2\Tools\MinGW\i686-w64-mingw32\lib\libstdc++-6.dll   | grep memmove
                  418 memmove

C:\qt\5.0.2>dumpbin /imports C:\qt\5.0.2\Tools\MinGW\i686-w64-mingw32\lib64\libstdc++-6.dll   | grep memmove
                         402 memmove

没有进口的memmove_s出现。

您的屏幕截图似乎也表明这也直接appmanager.exe取决于msvcrt.dll。也许这就是依赖的memmove_s来源?尝试运行以下命令:

dumpbin /imports appmanager.exe | grep memmove

(你需要一个 MS 工具链来获取 dumpbin,它只是一个包装器link /dump。我无法有效地objdump处理libstdc++-6.dll)。

于 2013-06-15T08:53:57.073 回答