Я использую набор инструментов MinGW-builds, предоставляемый Qt 5.0.2 для сборки проекта. В целом, дела идут хорошо, но я, кажется, столкнулся с проблемой. Когда бета-тестер запустил программу на своем компьютере с Windows XP, программа мгновенно завершает работу со следующей ошибкой:
Я ковырялся с помощью Зависимость Уокер и обнаружил две вещи:
msvcrt.dll включается, когда MinGW C ++ исполняет ссылки на него:
Удивительно, но его компьютер (и несколько других компьютеров в офисе) имеют версии 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 на новый, но
Многие программы активно используют среду выполнения (представьте себе), поэтому ее нельзя просто перезаписать.
Это звучит крайне злобно для установщика для непритязательного приложения в пользовательском пространстве. C:\Windows\System32
и начать замену файлов.
Копия 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
полезно).
Других решений пока нет …