вторник, 10 декабря 2013 г.

Visual Studio 2012: сборка C++ приложений с обратной совместимостью до Windows XP

После сборки на VS 2012 выясняется, что приложение попросту отказывается запускаться на Windows XP, хотя и нет ничего специфичного. Беда...

Что нужно сделать чтоб это исправить:
1. Обновляем Visual Studio до ServicePack 1 или новее (на момент написания актуален SP4). Без сервиспака, увы, ничего не выйдет. Эх, microsoft, microsoft...

2. В свойствах проекта на вкладке Configuration - Properties - параметр Platform Toolset выбираем пункт Visual Studio 2012 - Windows XP (v110_xp)

3. Обычно этого бывает достаточно. Но не всегда. В Windows XP нет функции GetTickCount64 в KERNEL32.DLL, а многие либы и программы ее используют (на удивление, даже если вы ей не пользовались - с большой вероятностью зависимость к ней будет). Чтобы избежать ее использования, нужно в свойствах проекта во вкладке C++ - Preprocessor - параметр Preprocessor Definitions добавить:
WINVER=0x0501;_WIN32_WINNT=0x0501

4. Если ваш софт использует функции PS API, то надо еще добавить в директивы препроцессора:
PSAPI_VERSION=1
Иначе работать не будет даже под вистой - только семерки и восьмерки.

После этого совместимость с WinXP будет достигнута

P.S. Если собираете boost на VS 2012 - он будет использовать GetTickCount64. Чтобы исправить, в параметры вызова сборщика bjam.exe добавить те же дефайны: define=WINVER=0x0501 define=_WIN32_WINNT=0x0501 define=NTDDI_VERSION=0x05010000 define=PSAPI_VERSION=1

Комментариев нет:

Отправить комментарий