CMake 中的平台检测

新手上路,请多包涵

我从 boost::asio 添加了一些功能,这引发了一些编译器“警告”:

请适当定义_WIN32_WINNT 或_WIN32_WINDOWS。

这里 就解决了这个问题。我想让 CMake 检测我何时在 Windows 上构建并做出适当的定义或命令行参数。

原文由 2NinerRomeo 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 837
2 个回答

这是一个简单的解决方案。

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

原文由 KneLL 发布,翻译遵循 CC BY-SA 3.0 许可协议

我想在这里澄清一个尚未有人提及的细节。这一点在交叉编译时尤其适用,但在其他情况下也有效。

CMAKE_HOST_WIN32 是在 Windows 上编译时设置的变量。

WIN32 是为 Windows 目标平台编译时设置的变量。

所以 CMAKE_HOST_WIN32 是正确的标志,考虑到 OP 的问题,字面意思是“当我在 Windows 上构建时”。在许多情况下 WIN32CMAKE_HOST_WIN32 将是等价的,但并非在所有情况下都是等价的。

WIN32 将在开始时在 Windows 上为非 Windows 交叉编译时设置,但在 CMake 执行期间的某个时候会隐式取消设置(我相信在 project 调用中)。上次我检查 WIN32 是在执行 toolchain.cmake 期间设置的,但后来没有设置。所以在这些情况下,这个标志可能是危险的,因为它的状态在执行期间发生了变化。您不应该在工具链文件中使用 WIN32

如果您需要有关正在构建的平台的详细信息,可以尝试变量 CMAKE_HOST_SYSTEM_NAMECMAKE_HOST_SYSTEM_VERSION

 MESSAGE("CMAKE_HOST_SYSTEM_NAME ${CMAKE_HOST_SYSTEM_NAME}")
MESSAGE("CMAKE_HOST_SYSTEM_VERSION ${CMAKE_HOST_SYSTEM_VERSION}")

给我以下输出(在 CMake 版本 3.19.2 上)

 CMAKE_HOST_SYSTEM_NAME Windows
CMAKE_HOST_SYSTEM_VERSION 10.0.19044

还有 CMAKE_HOST_SYSTEM 里面的工具链文件给了我空白,但是在 project 之后它给了“Windows-10.0.19044”

原文由 llahteinen 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题