MinGW在Windows XP上失败

时间:2013-06-13 21:59:51

标签: c++ qt windows-xp mingw msvcrt

我正在使用Qt 5.0.2提供的MinGW-builds工具链来构建项目。总的来说,情况进展顺利,但我似乎陷入困境。当beta测试人员在他的Windows XP计算机上运行程序时,程序会立即崩溃并出现以下错误:

XP crash dialog

我使用Dependency Walker进行了探测并发现了两件事:

  1. 当MinGW的C ++运行时链接到它时,msvcrt.dll会参与其中:
    Link trail

  2. 令人惊讶的是,他的计算机(以及办公室中的其他几台计算机)都有msvcrt.dll(Windows C运行时库)的版本,因为它们缺少所有"secure" CRT additions(明显是MinGW的C ++运行时)使用)。

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

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

    1. 许多程序正在积极使用运行时(想象一下),因此不能只是覆盖它。

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

1 个答案:

答案 0 :(得分:3)

与预构建的Qt 5.0.2(包含MinGW)程序包(libstdc++-6.dll)一起安装的qt-windows-opensource-5.0.2-mingw47_32-x86-offline.exe副本不会从memmove_s导入msvcrt.dll。< / p>

以下是Qt 5.0.2与MinGW软件包安装的各种版本的libstdc++-6.dll名称中带有“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