MinGW дает сбой в Windows XP

Я использую набор инструментов MinGW-builds, предоставляемый Qt 5.0.2 для сборки проекта. В целом, дела идут хорошо, но я, кажется, столкнулся с проблемой. Когда бета-тестер запустил программу на своем компьютере с Windows XP, программа мгновенно завершает работу со следующей ошибкой:

Диалог сбоя XP

Я ковырялся с помощью Зависимость Уокер и обнаружил две вещи:

  1. msvcrt.dll включается, когда MinGW C ++ исполняет ссылки на него:
    Ссылка тропа

  2. Удивительно, но его компьютер (и несколько других компьютеров в офисе) имеют версии msvcrt.dll (библиотека времени выполнения Windows C), настолько старые, что им не хватает всех «безопасные» дополнения ЭЛТ (который, по-видимому, использует среда выполнения C ++ MinGW).

Установка среды выполнения Visual C ++, которую предоставляет Qt (в Qt\Qt5.0.2\vcredist) ничего не решает, поскольку более поздние версии среды выполнения, такие как та, которую использует Qt, предоставляют различные файлы (такие как msvcp110.dll и msvcr110.dll VS11) вместо замены старой.

Есть ли обходной путь? Казалось бы, все версии MinGW ссылаются на этот файл, и я действительно предпочел бы не переключаться на Visual Studio 2010 (другой вариант, предлагаемый Qt 5) из-за его слабой поддержки C ++ 11. Первоначальная идея состояла бы в том, чтобы установщик заменил старый файл msvcrt.dll на новый, но

  1. Многие программы активно используют среду выполнения (представьте себе), поэтому ее нельзя просто перезаписать.

  2. Это звучит крайне злобно для установщика для непритязательного приложения в пользовательском пространстве. C:\Windows\System32 и начать замену файлов.

1

Решение

Копия libstdc++-6.dll устанавливается с готовым пакетом Qt 5.0.2 (с MinGW) (qt-windows-opensource-5.0.2-mingw47_32-x86-offline.exe) не импортирует memmove_s от msvcrt.dll,

Вот дамп всех импортов с «memmove» в названии из различных версий libstdc++-6.dll которые устанавливаются Qt 5.0.2 с пакетом MinGW:

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 toolchain, чтобы получить dumpbin, который является просто оберткой вокруг link /dump, Я не мог получить objdump обрабатывать libstdc++-6.dll полезно).

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]