使用CMake编译32位与64位项目

时间:2010-10-27 02:34:30

标签: 64-bit linker cmake

如何指定CMake应使用不同的link_directories值,具体取决于目标是32位还是64位?例如,32位二进制文​​件需要与32位Boost链接,64位二进制文​​件需要与64位Boost链接。

4 个答案:

答案 0 :(得分:28)

你可以沿着这些方向做点什么

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

答案 1 :(得分:12)

我知道这是一个很老的问题。但是,当您使用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,具体取决于您的架构。

答案 2 :(得分:4)

对于Boost,您应该使用

FIND_LIBRARY(Boost 1.44 COMPONENTS ...)

然后CMake变量Boost_LIBRARY_DIRS将包含正确的库路径,必须使用LINK_DIRECTORIES设置,例如

LINK_DIRECTORIES(${Boost_LIBRARY_DIRS})

更一般的情况在user434507的答案中正确描述。

答案 3 :(得分:0)

基于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在32位平台上等于4,在64位平台上等于8。
  • 表达式8*${CMAKE_SIZEOF_VOID_P}将评估为32或64, 分别
  • C:/Boost_${BITS}自动变为C:/Boost_32C:/Boost_64

优点:

  • 您不需要条件(在我的CMakeLists中已经有太多条件),
  • 90%你应该如何'包括使用CMake的Boost。