web-dev-qa-db-de.com

Kompilieren eines 32-Bit- oder 64-Bit-Projekts mit CMake

Wie lege ich fest, dass CMake einen anderen link_directories-Wert verwenden soll, abhängig davon, ob das Ziel 32-Bit oder 64-Bit ist? Beispielsweise müssen 32-Bit-Binärdateien mit 32-Bit-Boost verbunden werden, 64-Bit-Binärdateien müssen mit 64-Bit-Boost verknüpft werden.

26
Gili

Sie machen etwas in dieser Richtung

  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

Ich weiß, dass es eine ziemlich alte Frage ist. Es ist aber immer noch ganz oben, wenn Sie mit Google "cmake 32 64" suchen. Ich habe eine ähnliche Antwort wie die Antwort von user434507, aber meiner Meinung nach etwas lesbarer (ich mag nicht, ob-else Konstruktion in cmake, sie sieht hässlich aus):

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

Dies wird BOOST_LIBRARY Pfad zu/boost/win 32 / lib oder/boost/win 64 / lib zeigen, abhängig von Ihrer Architektur.

12
rominf

Für Boost sollten Sie speziell verwenden

FIND_LIBRARY(Boost 1.44 COMPONENTS ...)

Dann enthält die CMake-Variable Boost_LIBRARY_DIRS den richtigen Bibliothekspfad, der mit LINK_DIRECTORIES festgelegt werden muss, z.

LINK_DIRECTORIES(${Boost_LIBRARY_DIRS})

Der allgemeinere Fall ist in der Antwort von user434507 richtig beschrieben.

4
Martin

Basierend auf rominf habe ich folgende Lösung gefunden (für Windows). Ich installiere Boost-Bibliotheken in: C:\Boost_32 und C:\Boost_64

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

Erläuterung:

  • CMAKE_SIZEOF_VOID_P entspricht 4 auf der 32-Bit-Plattform und 8 auf der 64-Bit-Plattform.
  • Ausdruck 8*${CMAKE_SIZEOF_VOID_P} ergibt 32 bzw. 64.
  • C:/Boost_${BITS} wird automatisch zu C:/Boost_32 oder C:/Boost_64

Vorteile:

  • Sie brauchen keine Bedingungen (und in meinen CMakeLists gibt es bereits zu viele),
  • Es ist 90%, wie Sie Boost mit CMake "einschließen" sollten.
0
Nick