2010-10-27 158 views
24

如何根據目標是32位還是64位指定CMake應使用不同的link_directories值?例如,32位二進制文​​件需要與32位Boost鏈接,64位二進制文​​件需要與64位Boost鏈接。使用CMake編譯32位與64位項目

回答

25

你做沿着這些線路

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

按照Martin的規定,這不應該用於提升,但無論如何它都是一個很好的方法。 – tibur 2010-10-29 21:39:35

+6

什麼是cmake開發人員用else(...)部分語法思考的問題。如果順便說一句,那不是別的。困惑了我一會兒,直到我想起這件事。新的cmake語法不需要else,endif在括號中的東西。 – Matt 2012-10-04 00:06:22

4

升壓具體的東西,你應該使用

FIND_LIBRARY(Boost 1.44 COMPONENTS ...)

然後CMake的變量Boost_LIBRARY_DIRS將包含正確的庫路徑,它必須設置使用LINK_DIRECTORIES,例如

LINK_DIRECTORIES(${Boost_LIBRARY_DIRS})

更一般的情況下,user434507的答案是正確的描述。

11

我知道這是一個很老的問題。但當您使用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,具體取決於您的架構。

+0

錯誤:構建時發生CMake錯誤。cmake:27(math): 數學無法解析表達式:「8 *」:語法錯誤,意外$ end, 期待exp_OPENPARENT或exp_NUMBER(2) – 2016-05-17 12:41:52

+0

第二行有TINY錯誤。不是{$ BITS},而是$ {BITS}。括號前的$標誌。 – Nick 2017-09-01 14:57:25

0

基於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_32C:/Boost_64自動地

優點:

  • 你不需要條件語句(在我CMakeLists有太多的話),
  • 是90%如何你'應該'包含CMake的Boost。