Как обнаружить, если 64 бит MSVC с cmake?

У меня есть проект, который использует cmake, одна цель настроена только для сборки с помощью MSVC:

 if (MSVC)
     add_library(test SHARED source.cpp) 
 endif()

Теперь другая проблема заключается в том, что эта цель предназначена только для 32-битного MSVC. Итак, как я могу обнаружить, что генератор MSVC64 и пропустить эту цель?

Ответ 1

Существует несколько способов - также используемый самим 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()

Ссылки

Ответ 2

Обычный способ проверить, генерируете ли вы для архитектуры с 64 битами, - проверить CMAKE_SIZEOF_VOID_P:

if(CMAKE_SIZEOF_VOID_P EQUAL 8)
    # 64 bits
elseif(CMAKE_SIZEOF_VOID_P EQUAL 4)
    # 32 bits
endif()

Ответ 3

В последних версиях CMake/Visual Studio битность выбирается с помощью CMAKE_GENERATOR_PLATFORM, которая может быть указана в командной строке с опцией -A:

cmake -G "Visual Studio 16 2019" -A Win32 -DCMAKE_BUILD_TYPE=Release ..

Итак, на основе этой функции вы можете запросить значение из CMakeLists.txt:

if(NOT ("${CMAKE_GENERATOR_PLATFORM}" STREQUAL "Win64"))
    ...
ENDIF()

Ответ 4

Необязательным решением является создание базы условий по имени используемого компилятора.

if(CMAKE_CXX_COMPILER_ID MATCHES "MSVC")