Как правильно установить целевую версию ОС при сборке библиотеки в 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) только с этим.

Мне нужно использовать соответствующую опцию при настройке переменных среды компилятора с помощью «C: \ Program Files (x86) \ Microsoft Visual Studio 12.0 \ VC \ vcvarsall.bat», то есть «C: \ Program Files (x86) \ Microsoft Visual Studio 12.0». \ VC \ vcvarsall.bat amd64 "для 64-разрядных.

Мне тоже нужно уточнитьподходящее/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 немного новы для меня.

Ответы на вопрос(2)

Ваш ответ на вопрос