Подтвердить что ты не робот

Компиляция 32-битного и 64-битного проекта с использованием CMake

Как указать, что CMake должен использовать другое значение link_directories в зависимости от того, является ли цель 32-разрядной или 64-разрядной? Например, 32-битные двоичные файлы должны связываться с 32-разрядным Boost, 64-разрядные двоичные файлы должны связываться с 64-разрядным Boost.

4b9b3361

Ответ 1

Вы делаете что-то в этом направлении

  if( CMAKE_SIZEOF_VOID_P EQUAL 8 )
    set( BOOST_LIBRARY "/boost/win64/lib" )
  else( CMAKE_SIZEOF_VOID_P EQUAL 8 )
    set( BOOST_LIBRARY "/boost/win32/lib" )
  endif( CMAKE_SIZEOF_VOID_P EQUAL 8 )
  set( CMAKE_EXE_LINKER_FLAGS ${BOOST_LIBRARY} )

Ответ 2

Я знаю это довольно старый вопрос. Но он все еще на вершине, когда вы выполняете поиск в Google "cmake 32 64". У меня есть ответ, похожий на user434507 ответ, но немного более читаемый по моему мнению (мне не нравится if-else конструкция в cmake, это выглядит уродливо):

math(EXPR BITS "8*${CMAKE_SIZEOF_VOID_P}")
set(BOOST_LIBRARY "/boost/win${BITS}/lib")
set(CMAKE_EXE_LINKER_FLAGS ${BOOST_LIBRARY})

Это укажет путь BOOST_LIBRARY для /boost/win 32/lib или /boost/win 64/lib, в зависимости от вашей архитектуры.

Ответ 3

Для Boost специально вы должны использовать

FIND_LIBRARY(Boost 1.44 COMPONENTS ...)

Затем переменная CMake Boost_LIBRARY_DIRS будет содержать правильный путь к библиотеке, который должен быть установлен с помощью LINK_DIRECTORIES, например.

LINK_DIRECTORIES(${Boost_LIBRARY_DIRS})

Более общий случай правильно описан в user434507.

Ответ 4

На основе rominf я нашел следующее решение (для Windows). Я устанавливаю библиотеки boost в: C:\Boost_32 и C:\Boost_64

В CMakeLists.txt

math(EXPR BITS "8*${CMAKE_SIZEOF_VOID_P}")
set(BOOST_ROOT C:/Boost_${BITS})  

find_package(Boost 1.64.0 COMPONENTS ... )

INCLUDE_DIRECTORIES( ${Boost_INCLUDE_DIR}  )
LINK_DIRECTORIES(${Boost_LIBRARY_DIR})

Пояснение:

  • CMAKE_SIZEOF_VOID_P равен 4 на 32-битной платформе и 8 на 64-битной платформе.
  • Выражение 8*${CMAKE_SIZEOF_VOID_P} будет оцениваться до 32 или 64, соответственно.
  • C:/Boost_${BITS} автоматически переходит в C:/Boost_32 или C:/Boost_64

Преимущества:

  • Вам не нужны условные обозначения (и в моих CMakeLists их уже слишком много),
  • Это 90%, как вы должны включить Boost с CMake.