Определение платформы в 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 либо определение препроцессора, либо флаг командной строки выполняет задание.