如何根據目標是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。
- 1. 使用CMake生成32位/ 64位Eclipse CDT項目
- 2. 在CMake的項目中使用ttmath與Visual Studio編譯2013 64位編譯
- 3. 編譯爲64/32位iOS
- 4. 編譯32位VS 2003項目到64位
- 5. 從同一個項目編譯32位和64位?
- 6. 同時編譯32位和64位項目
- 7. Eclipse,爲64位設置編譯32位項目
- 8. 在64位DMD上編譯32位
- 9. 從Win7編譯32位64位
- 10. Java類編譯64位32位
- 11. 在64位Linux上編譯32位libGLEW.so
- 12. 32位指針在64位Solaris編譯
- 13. 將32位代碼編譯爲64位
- 14. VS COM項目編譯在32位,但在嘗試編譯64位
- 15. CMake使用32或64編譯器
- 16. Xcode:編譯與32位庫的64位應用程序
- 17. 64位項目中的32位.obj
- 18. 32位和64位安裝項目
- 19. 使用32位或64位DLL編譯.net應用程序
- 20. Java JDK 32位與64位
- 21. SHGetFolderPath()32位與64位
- 22. 如何編譯與32位庫鏈接的64位文件
- 23. 32與64位GC
- 24. 32與64位JVM
- 25. VS2010:編譯64位的C++項目
- 26. 大廈32位共享庫的64位Linux與cmake的
- 27. 使用32位.NET DLL是64位.NET項目
- 28. 使用QMAKE構建項目的32位和64位版本
- 29. 在64位ubuntu上編譯32位彙編程序
- 30. 32位/ 64位編譯和應用速度
按照Martin的規定,這不應該用於提升,但無論如何它都是一個很好的方法。 – tibur 2010-10-29 21:39:35
什麼是cmake開發人員用else(...)部分語法思考的問題。如果順便說一句,那不是別的。困惑了我一會兒,直到我想起這件事。新的cmake語法不需要else,endif在括號中的東西。 – Matt 2012-10-04 00:06:22