web-dev-qa-db-fra.com

Compiler un projet 32 ​​bits ou 64 bits avec CMake

Comment puis-je spécifier que CMake doit utiliser une valeur link_directories différente selon que la cible est 32 bits ou 64 bits? Par exemple, les fichiers binaires 32 bits doivent être liés à Boost 32 bits, tandis que les fichiers binaires 64 bits doivent être liés à Boost 64 bits.

26
Gili

Vous faites quelque chose dans ce sens

  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} )
28
Eugene Smith

Je sais que c'est une question assez ancienne. Mais c'est toujours au top lorsque vous effectuez une recherche avec Google "cmake 32 64". J'ai une réponse similaire à celle de user434507 mais un peu plus lisible à mon avis (je n'aime pas la construction if-else dans cmake, elle a l'air moche):

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

Ceci indiquera BOOST_LIBRARY chemin vers/boost/win 32 / lib ou/boost/win 64 / lib, selon votre architecture.

12
rominf

Pour Boost spécifiquement, vous devriez utiliser

FIND_LIBRARY(Boost 1.44 COMPONENTS ...)

Ensuite, la variable CMake Boost_LIBRARY_DIRS contiendra le chemin de bibliothèque correct, qui doit être défini à l'aide de LINK_DIRECTORIES, par exemple.

LINK_DIRECTORIES(${Boost_LIBRARY_DIRS})

Le cas plus général est correctement décrit dans la réponse de user434507.

4
Martin

Basé sur rominf, j’ai trouvé la solution suivante (pour Windows). J'installe les librairies boost dans: C:\Boost_32 et C:\Boost_64

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

Explication:

  • CMAKE_SIZEOF_VOID_P est égal à 4 sur la plate-forme 32 bits et 8 sur la plate-forme 64 bits.
  • L'expression 8*${CMAKE_SIZEOF_VOID_P} sera évaluée à 32 ou 64, respectivement.
  • C:/Boost_${BITS} se transforme en C:/Boost_32 ou C:/Boost_64 automatiquement

Avantages:

  • Vous n'avez pas besoin de conditionnels (et dans mes CMakeLists, il y en a déjà trop),
  • C'est 90% comment vous devriez inclure Boost avec CMake.
0
Nick