Como definir corretamente a versão do SO de destino ao criar uma biblioteca no Windows usando o compilador Visual C ++

Estou construindo uma biblioteca de plataforma cruzada usando o compilador Visual C ++ 2013 com recursos C ++ 11 especificamente na plataforma Windows, usando CMake (gerador NMake) para o sistema de compilação. Estou usando o Windows 7.

Minha biblioteca usa algumas funções / valores de enum / membros da estrutura disponíveis apenas no Windows 8/7.

Quero poder criar a biblioteca para as versões do Windows XP, Windows Vista, Windows 7 e Windows 8 / 8.1 OS e arquiteturas x86, x64 e arm, ou seja, não uma única compilação que atinja o Windows XP e funcione em qualquer lugar, mas em diferentes cria visando sistemas operacionais específicos, pois as versões mais recentes do sistema operacional possuem mais recursos úteis que minha biblioteca poderia fornecer.

Minhas perguntas são:

Como digo ao compilador para direcionar uma versão específica do sistema operacional (por exemplo, XP, Vista, 7, 8, 8.1, etc.)?

Como digo ao compilador para direcionar uma arquitetura específica (por exemplo, x86, x64, arm, etc.)?

O que acontece se eu usar funções / valores de enum / membros da estrutura disponíveis apenas no Windows 8/7, mas construir minha biblioteca com o Windows XP? O compilador me alertaria que essas coisas não existem no Windows XP? Ou seria realmente compilado, mas falha ao ser executado no sistema Windows XP?

Como faço para que, quando compilar para o Windows XP, meu código ignore coisas que não estão presentes no Windows XP (funções do Windows 7/8 e outras)?

Importa qual versão do Windows SDK eu uso ao direcionar diferentes versões do SO? Eu pareço ter instalado os SDKs do Windows 8.1, 8.0 e 7.1. Tudo bem se eu sempre usar a versão mais recente do SDK, mesmo com o Windows XP?

Aqui estão algumas respostas que encontrei, que não tenho certeza se estão corretas ou completas:

Eu só preciso definir_WIN32_WINNT eWINVER define paravalores apropriados para o sistema de destino e é isso, não preciso definir nada além disso, meu aplicativo será executado no sistema especificado (ou seja, Windows XP) com apenas isso.

Preciso usar a opção apropriada ao configurar variáveis de ambiente do compilador com "C: \ Arquivos de Programas (x86) \ Microsoft Visual Studio 12.0 \ VC \ vcvarsall.bat", ou seja, "C: \ Arquivos de Programas (x86) \ Microsoft Visual Studio 12.0 \ VC \ vcvarsall.bat amd64 "por 64 bits.

Eu também preciso especificarapropriado/SUBSYSTEM valor ao vinculador, ou seja,/SUBSYSTEM:WINDOWS,5.02 ou/SUBSYSTEM:WINDOWS,6.00 para x64. Mas qual é a diferença entre5.02 e6.00? Por que dois valores especificam a mesma coisa (64 bits)? Mesmo para5.01 e6.00, por que os dois especificam 32-bitness? Eu imagino que ter um valor único para 64/32 bits seria suficiente.

Esses valores (5.01, 5.02 e6.00) parecem semelhantes aos valores da plataforma deWINVER a partir de 1). Eles também definem o sistema operacional de destino, além da arquitetura? MasWINVER=502 from (1) é usado para direcionar o Windows Server 2003, que foi lançado nas versões de 64 bits e de 32 bits, de acordo com a wikipedia, mas aqui o 5.02 é estritamente de 64 bits, o que não faz sentido ...

O compilador falharia em compilar porque oWINVER define de (1) excluiria funções e itens não presentes no sistema operacional de segmentação (os arquivos de cabeçalho do Windows que definem para#ifdef coisas).

eu deveria#ifdef coisas baseadas emWINVER no meu próprio código, como os cabeçalhos do Windows, e fornecem alternativas para a funcionalidade ausente, quando necessário.

Não sei.

Observe que não estou usando o IDE do Visual Studio, portanto, é necessário dizer para definir a opção X no IDE.

Eu estou vindo do desenvolvimento do Linux, então as coisas do Windows são um pouco novas para mim.

questionAnswers(2)

yourAnswerToTheQuestion