【问题标题】:Compiling 32-bit vs 64-bit project using CMake使用 CMake 编译 32 位与 64 位项目
【发布时间】:2011-05-01 02:01:42
【问题描述】:

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

【问题讨论】:

    标签: 64-bit linker cmake


    【解决方案1】:

    你按照这些思路做一些事情

      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 不需要这个,但无论如何这是一个很好的了解方法。
    • cmake 开发人员对语法的 else ( ... ) 部分的想法是什么。顺便说一句,这不是别的。让我困惑了一会儿,直到我想起了这一点。新的 cmake 语法不需要括号中的 else、endif 内容。
    【解决方案2】:

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

    【讨论】:

    • Error: CMake Error at build.cmake:27 (math): math cannot parse the expression: "8*": syntax error, unexpected $end, expecting exp_OPENPARENT or exp_NUMBER (2)
    • 第二行有微小的错误。不是 {$BITS} 而是 ${BITS}。括号前的 $ 符号。
    【解决方案3】:

    特别是对于 Boost,您应该使用

    FIND_LIBRARY(Boost 1.44 COMPONENTS ...)

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

    LINK_DIRECTORIES(${Boost_LIBRARY_DIRS})

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

    【讨论】:

      【解决方案4】:

      基于 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_32 或 C:/Boost_64

      优点:

      • 您不需要条件(在我的 CMakeLists 中已经有太多了),
      • 90% 都是您“应该”在 CMake 中包含 Boost。

      【讨论】:

      • CMAKE_SIZEOF_VOID_P 对我来说总是空白 :( 我相信你需要运行 try_compile 才能获得有效值。
      • 尝试使用以下 2 行制作 CMakeLists.txt:"project(check_for_sizeof_void_p) message( ${CMAKE_SIZEOF_VOID_P} )" 并运行 "cmake ."
      • 我解决了这个问题。我认为我的防病毒软件正在阻止各种事情的发生。我将它移出受保护的目录并移入没有空格的路径(也许也是如此),一切都很好。奇怪...
      猜你喜欢
      • 2019-05-01
      • 2011-09-28
      • 1970-01-01
      • 2013-08-25
      • 2011-04-12
      • 1970-01-01
      • 2012-01-21
      • 2017-08-03
      • 2017-03-11
      相关资源
      最近更新 更多