2012-03-16 12 views
14

Ive añadió algunas funciones de impulso :: asio, que ha precipitado algunas "advertencias" compilador:detección de la plataforma en Cmake

favor definir _WIN32_WINNT o _WIN32_WINDOWS apropiadamente.

Ese problema fue tratado con here. Lo que me gustaría hacer es hacer que CMake detecte cuando estoy construyendo en Windows y hacer las definiciones apropiadas o los argumentos de línea de comando.

+0

encontrado una pequeña mina de oro en el cmake wiki: http://www.cmake.org/Wiki/CMake_Useful_Variables .. – 2NinerRomeo

Respuesta

19

Aquí hay una solución simple.

macro(get_WIN32_WINNT version) 
    if (WIN32 AND CMAKE_SYSTEM_VERSION) 
     set(ver ${CMAKE_SYSTEM_VERSION}) 
     string(REPLACE "." "" ver ${ver}) 
     string(REGEX REPLACE "([0-9])" "0\\1" ver ${ver}) 

     set(${version} "0x${ver}") 
    endif() 
endmacro() 

get_WIN32_WINNT(ver) 
add_definitions(-D_WIN32_WINNT=${ver}) 
+0

¡agradable y simple! +1 –

+0

if (WIN32) si es verdadero incluso si está compilando de forma cruzada en Windows para algo distinto de Windows. Terminará con -D_WIN32_WINNT incluso si está buscando algo más. – robUx4

+2

Para problemas de Windows 10, como 'Windows Kits \ 8.1 \ Include \ shared \ sdkddkver.h (255): error C2177: constante demasiado grande', verifique la respuesta de @squareskittles a continuación. – Tarc

17

Dentro de la CMakeLists.txt archivo que puede hacer:

IF (WIN32) 
    # set stuff for windows 
ELSE() 
    # set stuff for other systems 
ENDIF() 
+0

Eso es en parte no, estoy hurgando por la forma de definir las definiciones de preprocesador y la línea de comandos del compilador banderas. Creo que la sintaxis del enlazador es como 'set (CMAKE_EXE_LINK_FLAGS" $ {CMAKE_EXE_LINK_FLAGS} -linkerflag ")', así que espero que sea similar para los indicadores del compilador. Tampoco aprendí a agregar definiciones de preprocesador. – 2NinerRomeo

4

Como karlphilip señaló, se puede utilizar para la detección if(WIN32) plataforma.

Vas a tener una serie de posibilidades para pasar preprocesador define a la aplicación:

  • utilizar un encabezado de configuración que consigue pre-procesada por CMake de configure_file. Este enfoque tiene la ventaja de que todos los #define s son en realidad parte del código y no del entorno de compilación. La desventaja es que requiere un paso de preproceso (automático) por parte de CMake
  • Use add_definitions. Esto agregará el indicador de preprocesador para todos los archivos fuente en el proyecto, por lo que es un enfoque más rápido y sucio.
  • Utilice la propiedad COMPILE_DEFINITIONS. Esto permite un control más fino sobre las define en un archivo por archivo (y hasta per-config) Base: set_property(SOURCE ${YOUR_SOURCE_FILES} APPEND PROPERTY COMPILE_DEFINITIONS YOUR_FLAG1 YOUR_FLAG2)

    En versiones modernas CRealice (2.8.12 o superior) también se puede utilizar el comando más conveniente para este target_compile_definitions .

Normalmente prefiero este último, pero eso es sobre todo una cuestión de gusto personal.

-3

Esto es lo que he llegado con:

if(${WIN32}) 
#this method adds the necessary compiler flag 
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_WIN32_WINNT=0x0501") 
#this adds a preprocessor definition to the project 
add_definitions(-D_WIN32_WINNT=0x0501) 
endif() 

Para tratar con el impulso :: asio "advertencia" o bien la definición de preprocesador o el indicador de línea de comandos hace el trabajo.

+0

Esto está mal. Está agregando la definición '_WIN32_WINNT' dos veces, y también está arreglando la versión de Windows en XP. – cmannett85

+0

Gracias. Estoy tan contento de que otros hayan presentado soluciones superiores desde que publiqué esta pregunta. Ya que trajiste mi atención a eso, he cambiado mi respuesta aceptada. – 2NinerRomeo

1

Una versión mejorada de knells respuesta:

macro(get_WIN32_WINNT version) 
    if (WIN32 AND CMAKE_SYSTEM_VERSION) 
     set(ver ${CMAKE_SYSTEM_VERSION}) 
     string(REGEX REPLACE "^([0-9])[.]([0-9]).*" "0\\10\\2" ver ${ver}) 
     set(${version} "0x${ver}") 
    endif() 
endmacro() 

get_WIN32_WINNT(ver) 
add_definitions(-D_WIN32_WINNT=${ver}) 

versión knells no hizo ningún trabajo en mi caso, porque CMAKE_SYSTEM_VERSION fue 6.3.9600 que resultó en ${ver}=0x060306090000

Esta versión fallará para Windows 10 y más tarde, sin embargo. Uno tiene que verificar si el primer número es más grande que 9 y convertirlo al valor hexadecimal correcto.

8

Aquí hay una versión ampliada de la respuesta de KneLL, también para Windows 10.

if (WIN32) 
    macro(get_WIN32_WINNT version) 
     if (CMAKE_SYSTEM_VERSION) 
      set(ver ${CMAKE_SYSTEM_VERSION}) 
      string(REGEX MATCH "^([0-9]+).([0-9])" ver ${ver}) 
      string(REGEX MATCH "^([0-9]+)" verMajor ${ver}) 
      # Check for Windows 10, b/c we'll need to convert to hex 'A'. 
      if ("${verMajor}" MATCHES "10") 
       set(verMajor "A") 
       string(REGEX REPLACE "^([0-9]+)" ${verMajor} ver ${ver}) 
      endif ("${verMajor}" MATCHES "10") 
      # Remove all remaining '.' characters. 
      string(REPLACE "." "" ver ${ver}) 
      # Prepend each digit with a zero. 
      string(REGEX REPLACE "([0-9A-Z])" "0\\1" ver ${ver}) 
      set(${version} "0x${ver}") 
     endif(CMAKE_SYSTEM_VERSION) 
    endmacro(get_WIN32_WINNT) 

    get_WIN32_WINNT(ver) 
    add_definitions(-D_WIN32_WINNT=${ver}) 
endif(WIN32) 
+1

Puedo confirmar que esto funciona para Windows 10 (estaba usando @ KneLL pero se rompió cuando actualicé mi sistema). – Tarc