如何指定CMake在目标为32位或64位时使用不同的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} )
我知道这是一个比较老的问题。但是当你在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,取决于您的架构。
对于Boost库,您应该使用
FIND_LIBRARY(Boost 1.44 COMPONENTS ...)
然后,CMake变量Boost_LIBRARY_DIRS将包含正确的库路径,必须使用LINK_DIRECTORIES进行设置,例如:
LINK_DIRECTORIES(${Boost_LIBRARY_DIRS})
更一般的情况在user434507的回答中有正确描述。
根据我的经验,我找到了以下解决方案(适用于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
优点: