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.
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.
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.