我需要將boost庫添加到我的CMakeLists.txt中。你如何做或如何添加它?如何在CMakeLists.txt中添加boost庫
回答
在CMakeLists.txt
文件將這個(改變從OFF到ON任何選項,如果你想):
set(Boost_USE_STATIC_LIBS OFF)
set(Boost_USE_MULTITHREADED ON)
set(Boost_USE_STATIC_RUNTIME OFF)
find_package(Boost 1.45.0 COMPONENTS *boost libraries here*)
if(Boost_FOUND)
include_directories(${Boost_INCLUDE_DIRS})
add_executable(progname file1.cxx file2.cxx)
target_link_libraries(progname ${Boost_LIBRARIES})
endif()
顯然,你需要把你想去的地方,我把*boost libraries here*
庫。例如,如果您使用的filesystem
和regex
庫,你會寫:
find_package(Boost 1.45.0 COMPONENTS filesystem regex)
請注意,您不需要爲僅標頭庫指定組件,例如'lexical_cast'。因此你只需要'find_package'和'include_directories'命令。 –
在Windows上,它也可以幫助添加到您的cmake文件:ADD_DEFINITIONS(-DBOOST_ALL_NO_LIB),否則你可能會遇到http://stackoverflow.com/questions/28887680/linking-boost-library-with-boost-use- static-lib-off-on-windows –
是否可以將BOOST_USE_STATIC_LIBS設置爲ON並且Boost_USE_STATIC_RUNTIME OFF? & 反之亦然。 – squid
您可以使用find_package搜索可用Boost庫。它推遲搜索升級到FindBoost.cmake,這是與CMake默認安裝。
找到Boost後,find_package()
調用將填充許多變量(請檢查參考FindBoost.cmake)。其中有BOOST_INCLUDE_DIRS
,Boost_LIBRARIES和Boost_XXX_LIBRARY variabels,其中XXX用特定的Boost庫替換。您可以使用這些來指定include_directories和target_link_libraries。
例如,假設您需要的boost :: program_options和boost ::正則表達式,你會做這樣的事情:
find_package(Boost REQUIRED COMPONENTS program_options regex)
include_directories(${Boost_INCLUDE_DIRS})
add_executable(run main.cpp) # Example application based on main.cpp
# Alternatively you could use ${Boost_LIBRARIES} here.
target_link_libraries(run ${Boost_PROGRAM_OPTIONS_LIBRARY} ${Boost_REGEX_LIBRARY})
的一般提示:
- 搜索時,FindBoost檢查環境變量$ ENV {BOOST_ROOT}。如有必要,您可以在調用find_package之前設置此變量。
- 當您有多個boost版本(多線程,靜態,共享等)時,您可以在調用find_package之前指定所需的配置。通過將以下變量設置爲
On
來執行此操作:Boost_USE_STATIC_LIBS
,Boost_USE_MULTITHREADED
,Boost_USE_STATIC_RUNTIME
- 在Windows上搜索Boost時,請注意自動鏈接。閱讀reference中的「適用於Visual Studio用戶的注意事項」。
- 我的建議是禁用自動鏈接和使用的cmake的依賴處理:
add_definitions(-DBOOST_ALL_NO_LIB)
- 在某些情況下,可能需要顯式地指定一個動態升壓時:
add_definitions(-DBOOST_ALL_DYN_LINK)
- 我的建議是禁用自動鏈接和使用的cmake的依賴處理:
謝謝您提供一般提示。他們幫了我很多。 –
令人難以置信的有用答案!如果我在兩年前發現了這一點,會爲我節省很多時間。偉大的寫作。 – Ela782
我同意答案1和2。不過,我更願意單獨指定每個庫。這使得大項目中的依賴性更加清晰。但是,會有(區分大小寫的)變量名稱誤認的危險。 在這種情況下,沒有直接的cmake錯誤,但稍後會出現一些未定義的引用鏈接器問題,這可能需要一些時間才能解決。所以我用下面的cmake的功能:
function(VerifyVarDefined)
foreach(lib ${ARGV})
if(DEFINED ${lib})
else(DEFINED ${lib})
message(SEND_ERROR "Variable ${lib} is not defined")
endif(DEFINED ${lib})
endforeach()
endfunction(VerifyVarDefined)
對於上面提到的例子中,這看起來像:
VerifyVarDefined(Boost_PROGRAM_OPTIONS_LIBRARY Boost_REGEX_LIBRARY)
target_link_libraries(run ${Boost_PROGRAM_OPTIONS_LIBRARY} ${Boost_REGEX_LIBRARY})
如果我寫了「BOOST_PROGRAM_OPTIONS_LIBRARY」就不會有通過cmake並不會引發錯誤很久以後由連接器觸發。
適應@ LainIwakura的回答與進口指標現代CMake的語法,這將是:
set(Boost_USE_STATIC_LIBS OFF)
set(Boost_USE_MULTITHREADED ON)
set(Boost_USE_STATIC_RUNTIME OFF)
find_package(Boost 1.45.0 COMPONENTS filesystem regex)
if(Boost_FOUND)
add_executable(progname file1.cxx file2.cxx)
target_link_libraries(progname Boost::filesystem Boost::regex)
endif()
請注意,這是沒有必要再手動指定include目錄,因爲它已經通過照顧導入目標Boost::filesystem
和Boost::regex
。
regex
和filesystem
可以被你需要的任何boost庫替換。
如果你想說要與所有的提升聯繫起來,這會如何呢?我的意思是沒有列出所有的庫都在提升。 –
如果你只使用boost的header-only部分,'boost :: boost'就足夠了。所有編譯的boost庫都必須明確指定。 – oLen
這可能有助於某些人。我有一個調皮的錯誤: 未定義的參考符號「_ZN5boost6system15system_categoryEv」 //usr/lib/x86_64-linux-gnu/libboost_system.so.1.58.0:錯誤添加符號:DSO命令行缺少 有一些問題cmakeList.txt,不知何故,我錯過了明確包括「系統」和「文件系統」庫。因此,我在CMakeLists.txt中編寫了這些行
這些行是在創建項目的可執行文件之前寫入的,因爲在此階段我們不需要將boost庫鏈接到我們的項目可執行文件。
set(Boost_USE_STATIC_LIBS OFF)
set(Boost_USE_MULTITHREADED ON)
set(Boost_USE_STATIC_RUNTIME OFF)
set(Boost_NO_SYSTEM_PATHS TRUE)
if (Boost_NO_SYSTEM_PATHS)
set(BOOST_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/../../3p/boost")
set(BOOST_INCLUDE_DIRS "${BOOST_ROOT}/include")
set(BOOST_LIBRARY_DIRS "${BOOST_ROOT}/lib")
endif (Boost_NO_SYSTEM_PATHS)
find_package(Boost COMPONENTS regex date_time system filesystem thread graph program_options)
find_package(Boost REQUIRED regex date_time system filesystem thread graph program_options)
find_package(Boost COMPONENTS program_options REQUIRED)
現在在文件的結尾,我考慮「KeyPointEvaluation」爲我的項目的可執行寫下這行。
if(Boost_FOUND)
include_directories(${BOOST_INCLUDE_DIRS})
link_directories(${Boost_LIBRARY_DIRS})
add_definitions(${Boost_DEFINITIONS})
include_directories(${Boost_INCLUDE_DIRS})
target_link_libraries(KeyPointEvaluation ${Boost_LIBRARIES})
target_link_libraries(KeyPointEvaluation ${Boost_PROGRAM_OPTIONS_LIBRARY} ${Boost_FILESYSTEM_LIBRARY} ${Boost_REGEX_LIBRARY} ${Boost_SYSTEM_LIBRARY})
endif()
- 1. 在cmakelists.txt中添加opencv android
- 2. 如何將此共享庫添加到我的CMakeLists.txt中?
- 3. Netbeans IDE 7.2.1:如何添加C++ boost庫
- 4. 不知道如何將opencv庫添加到CMakeLists.txt
- 5. 多庫CMakeLists.txt
- 6. 如何將boost線程庫添加到iPhone項目中?
- 7. 如何在RPI2上添加Boost庫到QTCreator?
- 8. 將CMakeLists.txt模式添加到Ctags langmap
- 9. 如何將lua5.1添加到CMakeLists.txt?錯誤:lua.hpp找不到
- 10. 如何添加幾個.cpp文件到一個單一的CMakeLists.txt
- 11. 如何添加cpp/h文件到android NDK CMakeLists.txt?
- 12. 如何將NSIS的RequestExecutionLevel選項添加到CMakeLists.txt
- 13. 如何跟蹤CMakeLists.txt
- 14. CMake:如何在CMakeLists.txt中設置LDFLAGS?
- 15. 如何覆蓋C庫中的fprintf?如何將GCC選項添加到頂級CMakeLists.txt?
- 16. 如何添加代理支持boost :: asio?
- 17. 在xcode中添加boost庫到cocos2d-x項目?
- 18. 如何添加庫在C
- 19. 如何在boost :: system庫中使用error_condition?
- 20. 在Windows XP中添加boost-dev-C++
- 21. 如何在Boost :: Statechart中添加轉換延遲
- 22. 在boost :: asio中,如何給服務循環添加超時?
- 23. Solr:如何在Boost函數查詢中添加條件
- 24. 如何在C++中使用boost :: future添加回調
- 25. 如何在Boost :: Statechart中向狀態添加20多個轉換?
- 26. 如何在tcpdf庫中添加頁腳
- 27. 如何在QT4.8.7中添加QSerialPort庫
- 28. 如何在kotlin程序中添加庫?
- 29. 如何在xcode中添加媒體庫?
- 30. 如何在Intellij Idea中添加庫
這行rosbuild_add_boost_directories()是做什麼的? – laksh