使用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})
升压具体的东西,你应该使用
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,具体取决于您的架构。
错误:构建时发生CMake错误。cmake:27(math): 数学无法解析表达式:“8 *”:语法错误,意外$ end, 期待exp_OPENPARENT或exp_NUMBER(2) – 2016-05-17 12:41:52
第二行有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_32
或C:/Boost_64
自动地
优点:
- 你不需要条件语句(在我CMakeLists有太多的话),
- 是90%如何你'应该'包含CMake的Boost。
按照Martin的规定,这不应该用于提升,但无论如何它都是一个很好的方法。 – tibur 2010-10-29 21:39:35
什么是cmake开发人员用else(...)部分语法思考的问题。如果顺便说一句,那不是别的。困惑了我一会儿,直到我想起这件事。新的cmake语法不需要else,endif在括号中的东西。 – Matt 2012-10-04 00:06:22