使用CMake编译32位与64位项目的区别

31

如何指定CMake在目标为32位或64位时使用不同的link_directories值?例如,32位二进制需要链接32位的Boost库,而64位二进制需要链接64位的Boost库。

4个回答

33

你可以按照以下方式进行操作

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

正如Martin所指出的那样,这对于boost来说并不是必需的,但无论如何了解这种方法都是很好的。 - tibur
10
cmake的开发者在语法中添加else(...)部分的意图是什么?顺便说一下,那不是else if。这让我有点困惑,直到我记起来为止。新的cmake语法中不需要用括号包裹的else和endif语句。 - hookenz

13

我知道这是一个比较老的问题。但是当你在Google搜索“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/win32/lib 或 /boost/win64/lib,取决于您的架构。


错误:在build.cmake的第27行(math)处发生CMake错误: math无法解析表达式:“8 *”:语法错误,意外的$end, 期望exp_OPENPARENT或exp_NUMBER(2) - Abhishek Jain
第二行有一个小错误。不是{$BITS}而是${BITS}。方括号前面要加上美元符号。 - Nick

4

对于Boost库,您应该使用

FIND_LIBRARY(Boost 1.44 COMPONENTS ...)

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

LINK_DIRECTORIES(${Boost_LIBRARY_DIRS})

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


0

根据我的经验,我找到了以下解决方案(适用于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中已经有太多了),
  • 这是使用CMake正确包含Boost的90%方法。

CMAKE_SIZEOF_VOID_P 对我来说总是空白的 :( 我相信您需要在其具有有效值之前运行 try_compile。 - David Ledger
尝试使用以下两行创建CMakeLists.txt文件:“project(check_for_sizeof_void_p)
message( ${CMAKE_SIZEOF_VOID_P} )”,然后运行“cmake .”。
- Nick
1
我解决了这个问题。我认为我的防病毒软件阻止了一些事情的发生。我将它从受保护的目录移出,并移到没有空格的路径中(也许是这个原因),现在一切都好了。很奇怪... - David Ledger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接