Cómo configurar correctamente la versión del sistema operativo de destino al crear una biblioteca en Windows utilizando el compilador de Visual C ++
Estoy construyendo una biblioteca multiplataforma usando el compilador Visual C ++ 2013 con características de C ++ 11 en la plataforma Windows específicamente, usando CMake (generador NMake) para el sistema de compilación. Estoy usando Windows 7.
Mi biblioteca usa algunas funciones / valores de enumeración / miembros de estructura disponibles solo en Windows 8/7.
Quiero poder construir la biblioteca para Windows XP, Windows Vista, Windows 7 y Windows 8 / 8.1 OS y arquitecturas x86, x64 y arm, es decir, no una sola compilación que solo esté dirigida a Windows XP y funcione en todas partes, sino muchas construye apuntando a sistemas operativos específicos, ya que las versiones más nuevas del sistema operativo tienen más características útiles que mi biblioteca podría proporcionar.
Mis preguntas son:
¿Cómo le digo al compilador que apunte a una versión específica del sistema operativo (es decir, XP, Vista, 7, 8, 8.1, etc.)?
¿Cómo le digo al compilador que apunte a una arquitectura específica (es decir, x86, x64, arm, etc.)?
¿Qué sucede si uso funciones / valores de enumeración / miembros de estructura disponibles solo en Windows 8/7 pero construyo mi biblioteca dirigida a Windows XP? ¿El compilador me advertiría que tales cosas no existen en Windows XP? ¿O realmente se compilaría pero no se ejecutaría en el sistema Windows XP?
¿Cómo hago para que, cuando compilo para Windows XP, mi código omita cosas que no están presentes en Windows XP (funciones de Windows 7/8 y demás)?
¿Importa qué versión de SDK de Windows utilizo cuando apunto a diferentes versiones de SO? Parece que he instalado SDK de Windows 8.1, 8.0 y 7.1. ¿Está bien si siempre uso la última versión del SDK, incluso cuando me dirijo a Windows XP?
Aquí hay algunas respuestas que encontré, que no estoy seguro de que sean correctas o completas:
Solo necesito configurar_WIN32_WINNT
yWINVER
define avalores apropiados para el sistema objetivo y eso es todo, no necesito configurar nada además de eso, mi aplicación se ejecutará en el sistema especificado (es decir, Windows XP) con solo eso.
También necesito especificarapropiado/SUBSYSTEM
valor al enlazador, es decir/SUBSYSTEM:WINDOWS,5.02
o/SUBSYSTEM:WINDOWS,6.00
para x64. Pero, ¿cuál es la diferencia entre5.02
y6.00
? ¿Por qué dos valores especifican lo mismo (64 bits)? Igual por5.01
y6.00
, ¿por qué ambos especifican 32 bits? Emagine tener un solo valor para 64/32 bit sería suficiente.
5.01
, 5.02
y6.00
) se parecen a los valores de la plataforma deWINVER
de 1). ¿También establecen el sistema operativo de destino, además de la arquitectura? PeroWINVER=502
from (1) se usa para apuntar a Windows Server 2003, que se lanzó en versiones de 64 bits y 32 bits de acuerdo con wikipedia, pero aquí 5.02 es estrictamente para 64 bits, lo que no tiene sentido ...El compilador no podría compilar porque elWINVER
define from (1) excluiría funciones y cosas que no están presentes en el sistema operativo de destino (el uso de archivos de encabezado de Windows que define#ifdef
cosas).
Yo debería#ifdef
cosas basadas enWINVER
en mi propio código, como lo hacen los encabezados de Windows, y proporcionar alternativas para la funcionalidad que falta cuando sea necesario.
No se
Tenga en cuenta que no estoy usando Visual Studio IDE, por lo que decirme que configure la opción X en el IDE no tiene sentido.
Vengo del desarrollo de Linux, por lo que las cosas de Windows son un poco nuevas para mí.