Что особенного в исполняемых файлах, скомпилированных с помощью Visual Studio 11, что приводит к тому, что исполняемые файлы не могут быть выполнены в Windows XP?
Я скомпилирую свой исходный код на С++ с помощью Visual Studio 11 Developer Preview. Я статически ссылаюсь на библиотеку времени выполнения.
Результирующий исполняемый файл не может быть выполнен в Windows XP. Когда я пытаюсь выполнить его в Windows XP, я получаю сообщение об ошибке "[Исполняемый путь] не является допустимым приложением Win32.".
В соответствии с Microsoft Visual Studio 11 не будет поддерживать Windows XP.
Как это работает, что исполняемый файл не может быть выполнен в Windows XP? Есть ли что-то особенное в исполняемом файле?
Ответы
Ответ 1
Кажется, что они отказываются от поддержки старых систем в каждой новой версии VS (NT4,2000, XP) Даже если вы не используете CRT вообще, они все еще вынуждают версию подсистемы PE к большим числам. Вы можете обойти это с помощью изменения числа от до 5.0 на этапе пост-сборки. Простое изменение этих чисел должно позволить exe запускаться на XP, если новый CRT не использует функции WinAPI, которых нет в XP.
Другой альтернативой, если вы хотите использовать VS11, является использование многоцелевых и старых компиляторов...
Ответ 2
Visual Studio 2012 сможет ориентироваться на Windows XP позднее в 2012 году:
Ориентация Windows XP на С++ в Visual Studio 2012
"Позже этой осенью Microsoft представит обновление для Visual Studio 2012, которое позволит приложениям С++ ориентироваться на Windows XP. Это обновление внесит необходимые изменения в компилятор Visual С++ 2012, среду выполнения и библиотеки, чтобы разработчики могли создавать приложений и DLL, которые работают в Windows XP и более поздних версиях, а также Windows Server 2003 и выше."
Изменить: это произошло (phew!)
Ответ 3
Обходной путь заключается в использовании другого Platform Toolset
, который свяжет другую версию CRT и создаст двоичные файлы, совместимые с более старыми операционными системами.
Подробнее здесь: Целевая Windows XP в бета-версии Visual Studio 11 с использованием компилятора и библиотек Visual Studio 2010.
С помощью инструментария v90
ваш двоичный файл сможет работать даже в более старых системах, таких как Windows 2000.
http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-65-69/7444.BlogPic.png
Ответ 4
Библиотеки времени выполнения, в комплекте с VS 2010 и более поздними версиями, принуждают ваш исполняемый файл импортировать две новые функции из kernel32.dll, отсутствующие в Windows XP: EncodePointer
и DecodePointer
. Это необходимо для еще одной идиотической наивной попытки повысить безопасность программного обеспечения.
В VS 2010 существует возможность использовать библиотеки времени исполнения Visual Studio 2008, которые решают эту проблему. Я не знаю, есть ли такая опция в более поздних версиях VS.