【发布时间】:2011-05-01 02:01:42
【问题描述】:
如何根据目标是 32 位还是 64 位来指定 CMake 应该使用不同的 link_directories 值?例如,32 位二进制文件需要与 32 位 Boost 链接,64 位二进制文件需要与 64 位 Boost 链接。
【问题讨论】:
如何根据目标是 32 位还是 64 位来指定 CMake 应该使用不同的 link_directories 值?例如,32 位二进制文件需要与 32 位 Boost 链接,64 位二进制文件需要与 64 位 Boost 链接。
【问题讨论】:
你按照这些思路做一些事情
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} )
【讨论】:
我知道这是一个很老的问题。但是当你用谷歌搜索“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,具体取决于您的架构。
【讨论】:
特别是对于 Boost,您应该使用
FIND_LIBRARY(Boost 1.44 COMPONENTS ...)
然后 CMake 变量 Boost_LIBRARY_DIRS 将包含正确的库路径,必须使用 LINK_DIRECTORIES 设置,例如
LINK_DIRECTORIES(${Boost_LIBRARY_DIRS})
user434507 的回答中正确描述了更一般的情况。
【讨论】:
基于 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
优点:
【讨论】: