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