Как правильно установить целевую версию ОС при сборке библиотеки в Windows с помощью компилятора Visual C ++
Я создаю кроссплатформенную библиотеку, используя компилятор Visual C ++ 2013 с функциями C ++ 11 специально для платформы Windows, используя CMake (генератор NMake) для системы сборки. Я использую Windows 7.
Моя библиотека использует некоторые из функций / значений перечисления / членов структуры, доступных только в Windows 8/7.
Я хочу иметь возможность собирать библиотеку для версий Windows XP, Windows Vista, Windows 7 и Windows 8 / 8.1 и архитектур x86, x64 и arm, т.е. ни одной сборки, предназначенной только для Windows XP и работающей повсюду, но для множества разных сборки, ориентированные на конкретные ОС, так как более новые версии ОС имеют больше полезных функций, которые может предоставить моя библиотека.
Мои вопросы:
Как мне сказать компилятору, чтобы он указывал на конкретную версию ОС (то есть XP, Vista, 7, 8, 8.1 и т. Д.)?
Как мне сказать компилятору, чтобы он предназначался для конкретной архитектуры (например, x86, x64, arm и т. Д.)?
Что произойдет, если я использую функции / перечислимые значения / элементы структуры, доступные только в Windows 8/7, но создаю свою библиотеку, ориентированную на Windows XP? Будет ли компилятор предупреждать меня, что таких вещей не существует в Windows XP? Или он на самом деле компилируется, но не запускается в системе Windows XP?
Как мне сделать так, чтобы при компиляции для Windows XP мой код пропускал то, чего нет в Windows XP (функции Windows 7/8 и т. Д.)?
Имеет ли значение, какую версию Windows SDK я использую для разных версий ОС? Кажется, я установил 8.1, 8.0 и 7.1 Windows SDK. Это нормально, если я всегда использую последнюю версию SDK, даже когда ориентируюсь на Windows XP?
Вот некоторые ответы, которые я нашел, но я не уверен, что они правильные или полные:
Мне просто нужно установить_WIN32_WINNT
а такжеWINVER
определяетсоответствующие значения для целевой системы и это все, мне не нужно ничего устанавливать в дополнение к этому, мое приложение будет работать на указанной системе (то есть Windows XP) только с этим.
Мне тоже нужно уточнитьподходящее/SUBSYSTEM
значение компоновщику, т.е./SUBSYSTEM:WINDOWS,5.02
или же/SUBSYSTEM:WINDOWS,6.00
для х64. Но в чем разница между5.02
а также6.00
? Почему два значения указывают одну и ту же вещь (64-битность)? То же самое для5.01
а также6.00
почему они оба указывают 32-битность? Я хотел бы представить, что было бы достаточно одного значения для 64/32 бит.
5.01
, 5.02
а также6.00
) похожи на значения платформы изWINVER
от 1). Они также устанавливают целевую ОС, помимо архитектуры? НоWINVER=502
from (1) используется для нацеливания на Windows Server 2003, который был выпущен как в 64-битной, так и в 32-битной версиях согласно википедии, но здесь 5.02 означает строго 64-битную, что не имеет смысла ...Компилятор не сможет скомпилировать, потому чтоWINVER
определение из (1) исключило бы функции и прочее, которых нет в целевой системе ОС (использование заголовочных файлов Windows, которые определяют для#ifdef
вещи).
Я должен#ifdef
вещи, основанные наWINVER
в моем собственном коде, как это делают заголовки Windows, и при необходимости предоставляют альтернативы отсутствующим функциям.
Не знаю
Обратите внимание, что я не использую Visual Studio IDE, поэтому указывать параметр X в IDE немного бессмысленно.
Я прихожу из разработки Linux, так что вещи для Windows немного новы для меня.