web-dev-qa-db-ja.com

CMakeを使用して32ビットと64ビットのプロジェクトをコンパイルする

ターゲットが32ビットか64ビットかに応じて、CMakeが異なるlink_directories値を使用するように指定するにはどうすればよいですか?たとえば、32ビットバイナリは32ビットBoostとリンクする必要があり、64ビットバイナリは64ビットBoostとリンクする必要があります。

28
Gili

あなたはこれらの線に沿って何かをします

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

私はそれがかなり古い質問であることを知っています。しかし、グーグル「cmake 32 64」で検索すると、それはまだトップです。私はuser434507の答えに似た答えを持っていますが、私の意見ではもう少し読みやすくなっています(cmakeでのif-else構造は好きではありません、見苦しいです):

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 2/libまたは/ boost/win 64/libになります。

12
rominf

特にBoostの場合は、

FIND_LIBRARY(Boost 1.44 COMPONENTS ...)

次に、CMake変数Boost_LIBRARY_DIRSに正しいライブラリパスが含まれます。これは、LINK_DIRECTORIESを使用して設定する必要があります。

LINK_DIRECTORIES(${Boost_LIBRARY_DIRS})

より一般的なケースは、user434507の回答に正しく記述されています。

4
Martin

Rominfに基づいて、次の解決策を見つけました(Windows用)。ブーストライブラリを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は、32ビットプラットフォームでは4、64ビットプラットフォームでは8に相当します。
  • 8*${CMAKE_SIZEOF_VOID_P}はそれぞれ32または64に評価されます。
  • C:/Boost_${BITS} に変わる C:/Boost_32またはC:/Boost_64自動的に

利点:

  • 条件文は必要ありません(そして私のCMakeListsにはすでに多すぎます)、
  • それはあなたがCMakeでブーストを含めるべきである方法の90%です。
0
Nick