Определение платформы в Cmake

Ive добавил некоторые функции от boost:: asio, что ускорило некоторые предупреждения "

:

Пожалуйста, определите _WIN32_WINNT или _WIN32_WINDOWS соответственно.

Эта проблема была рассмотрена здесь. То, что я хотел бы сделать, - это обнаружить CMake, когда я создаю окна, и сделаю соответствующие определения или аргументы командной строки.

Ответы

Ответ 1

Вот простое решение.

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})

Ответ 2

Внутри файла CMakeLists.txt вы можете:

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

Ответ 3

Здесь представлена ​​расширенная версия ответа KneLL, также проверяющая 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)

Ответ 4

Как указал karlphilip, вы можете использовать if(WIN32) для обнаружения платформы.

У вас будет несколько возможностей для передачи препроцессора в приложение:

  • Используйте заголовок configure, который предварительно обрабатывается CMake configure_file. Преимущество такого подхода состоит в том, что все #define на самом деле являются частью кода, а не среды сборки. Недостатком является то, что он требует (автоматической) предварительной обработки CMake
  • Используйте add_definitions. Это добавит флаг препроцессора для всех исходных файлов в проекте, поэтому он будет более быстрым и грязным.
  • Используйте свойство COMPILE_DEFINITIONS. Это позволяет осуществлять мелкозернистый контроль над определениями для каждого файла (и даже для каждого): set_property(SOURCE ${YOUR_SOURCE_FILES} APPEND PROPERTY COMPILE_DEFINITIONS YOUR_FLAG1 YOUR_FLAG2)

    В современных версиях CMake (2.8.12 и выше) вы также можете использовать более удобную target_compile_definitions для этого.

Я обычно предпочитаю последнее, но это в основном вопрос личного вкуса.

Ответ 5

Улучшенная версия ответа KneLLs:

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})

Версия KneLLs в моем случае не работала, потому что CMAKE_SYSTEM_VERSION был 6.3.9600, что привело к ${ver}=0x060306090000

Однако эта версия завершится неудачно для Windows 10 и более поздних версий. Нужно проверить, больше ли первое число больше 9 и преобразовать его в правильное шестнадцатеричное значение.

Ответ 6

Вот что я придумал:

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()

Для работы с предупреждением boost:: asio либо определение препроцессора, либо флаг командной строки выполняет задание.