2011-07-11 41 views

回答

124

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*庫。例如,如果您使用的filesystemregex庫,你會寫:

find_package(Boost 1.45.0 COMPONENTS filesystem regex) 
+1

請注意,您不需要爲僅標頭庫指定組件,例如'lexical_cast'。因此你只需要'find_package'和'include_directories'命令。 –

+1

在Windows上,它也可以幫助添加到您的cmake文件:ADD_DEFINITIONS(-DBOOST_ALL_NO_LIB),否則你可能會遇到http://stackoverflow.com/questions/28887680/linking-boost-library-with-boost-use- static-lib-off-on-windows –

+0

是否可以將BOOST_USE_STATIC_LIBS設置爲ON並且Boost_USE_STATIC_RUNTIME OFF? & 反之亦然。 – squid

68

您可以使用find_package搜索可用Boost庫。它推遲搜索升級到FindBoost.cmake,這是與CMake默認安裝。

找到Boost後,find_package()調用將填充許多變量(請檢查參考FindBoost.cmake)。其中有BOOST_INCLUDE_DIRS,Boost_LIBRARIES和Boost_XXX_LIBRARY variabels,其中XXX用特定的Boost庫替換。您可以使用這些來指定include_directoriestarget_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)
+3

謝謝您提供一般提示。他們幫了我很多。 –

+0

令人難以置信的有用答案!如果我在兩年前發現了這一點,會爲我節省很多時間。偉大的寫作。 – Ela782

2

我同意答案12。不過,我更願意單獨指定每個庫。這使得大項目中的依賴性更加清晰。但是,會有(區分大小寫的)變量名稱誤認的危險。 在這種情況下,沒有直接的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並不會引發錯誤很久以後由連接器觸發。

5

適應@ 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::filesystemBoost::regex
regexfilesystem可以被你需要的任何boost庫替換。

+1

如果你想說要與所有的提升聯繫起來,這會如何呢?我的意思是沒有列出所有的庫都在提升。 –

+1

如果你只使用boost的header-only部分,'boost :: boost'就足夠了。所有編譯的boost庫都必須明確指定。 – oLen

0

這可能有助於某些人。我有一個調皮的錯誤: 未定義的參考符號「_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() 
相關問題