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

问题描述:

如何根据目标是32位还是64位指定CMake应使用不同的link_directories值?例如,32位二进制文​​件需要与32位Boost链接,64位二进制文​​件需要与64位Boost链接。使用CMake编译32位与64位项目

你做沿着这些线路

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

按照Martin的规定,这不应该用于提升,但无论如何它都是一个很好的方法。 – tibur 2010-10-29 21:39:35

+6

什么是cmake开发人员用else(...)部分语法思考的问题。如果顺便说一句,那不是别的。困惑了我一会儿,直到我想起这件事。新的cmake语法不需要else,endif在括号中的东西。 – Matt 2012-10-04 00:06:22

升压具体的东西,你应该使用

FIND_LIBRARY(Boost 1.44 COMPONENTS ...)

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

LINK_DIRECTORIES(${Boost_LIBRARY_DIRS})

更一般的情况下,user434507的答案是正确的描述。

我知道这是一个很老的问题。但当您使用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路径/升压/ win/lib或/ boost/win/lib,具体取决于您的架构。

+0

错误:构建时发生CMake错误。cmake:27(math): 数学无法解析表达式:“8 *”:语法错误,意外$ end, 期待exp_OPENPARENT或exp_NUMBER(2) – 2016-05-17 12:41:52

+0

第二行有TINY错误。不是{$ BITS},而是$ {BITS}。括号前的$标志。 – Nick 2017-09-01 14:57:25

基于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_32C:/Boost_64自动地

优点:

  • 你不需要条件语句(在我CMakeLists有太多的话),
  • 是90%如何你'应该'包含CMake的Boost。