如何使用cmake检测64位MSVC?

pau*_*ulm 21 cmake visual-studio

我有一个使用cmake的项目,一个目标设置为仅使用MSVC构建:

 if (MSVC)
     add_library(test SHARED source.cpp) 
 endif()
Run Code Online (Sandbox Code Playgroud)

现在另一个问题是这个目标只针对MSVC 32bit.那么如何检测到生成器是MSVC64并跳过此目标?

was*_*ful 30

检查是否为64位体系结构生成的常用方法是测试CMAKE_SIZEOF_VOID_P:

if(CMAKE_SIZEOF_VOID_P EQUAL 8)
    # 64 bits
elseif(CMAKE_SIZEOF_VOID_P EQUAL 4)
    # 32 bits
endif()
Run Code Online (Sandbox Code Playgroud)


Flo*_*ian 20

有几种方法 - 也由CMake本身使用 - 将检查"not 64Bit":

if(NOT "${CMAKE_GENERATOR}" MATCHES "(Win64|IA64)")
    ...
endif()

if("${CMAKE_SIZEOF_VOID_P}" STREQUAL "4")
    ...
endif()

if(NOT CMAKE_CL_64)
   ...
endif()
Run Code Online (Sandbox Code Playgroud)

参考

  • 提防`cmake 3.14 release',现在删除了生成器名称中的位数:https://cmake.org/cmake/help/v3.14/generator/Visual%20Studio%2016%202019.html#generator:Visual %20Studio%2016%202019 (6认同)
  • **2019**:上面的 CMAKE_GENERATOR 代码已经过时了。Visual Studio 2019 的生成器没有位数后缀(默认为 64 位),除非用户在 CMake 中手动指定“生成器目标平台”。这些平台已更名为 ARM64、ARM、Win32 和 x64。这不是查找目标生成器平台的可靠方法...请勿使用上面的“CMAKE_GENERATOR”代码。此外,“CMAKE_SIZEOF_VOID_P”也不起作用。即使构建 32 位应用程序,它也始终是 64 位。`CMAKE_CL_64` 似乎最好(当理解时):https://gitlab.kitware.com/cmake/cmake/issues/16504 (5认同)
  • **2019 第 2 部分**:但是,`CMAKE_CL_64` 有其自身的问题,这里的人声称如果您使用 64 位 Windows 来运行编译器,则它根本没有设置:https://itk.org/ Bug/print_bug_page.php?bug_id=9065 (我可以确认我找不到该函数的任何值)。叹息...真是一团糟。也许我会尝试编写一些能够可靠地扫描“CMAKE_GENERATOR”以获取我刚刚描述的最新 32 位关键字的内容,否则将其视为 64 位......但即使在该解决方案中,“ARM”与“ARM64”也会有风险(不希望他们被视为相同)。 (4认同)
  • 最新版本的 CMake(当时为 3.17)的[文档](https://cmake.org/cmake/help/v3.17/variable/CMAKE_CL_64.html) 提供了“CMAKE_CL_64”的描述:“不鼓励。请改用 CMAKE_SIZEOF_VOID_P。” (2认同)