1. 程式人生 > 實用技巧 >Linux下使用CMake進行編譯的時候尋找Boost庫

Linux下使用CMake進行編譯的時候尋找Boost庫

find_package

通過呼叫find_package可以找到標頭檔案和所需要的庫檔案或者是一個CMake打包配置檔案,

find_package(Boost
  [version] [EXACT]      # 可選項,最小版本或者確切所需版本
  [REQUIRED]             # 可選項,如果找不到所需庫,報錯
  [COMPONENTS <libs>...] # 所需的庫名稱,比如說. "date_time" 代表 "libboost_date_time"
  )     

執行完後可以得到很多變數,下面列了一些主要的

Boost_FOUND            - 如果找到了所需的庫就設為true
Boost_INCLUDE_DIRS     - Boost標頭檔案搜尋路徑
Boost_LIBRARY_DIRS     - Boost庫的連結路徑
Boost_LIBRARIES        - Boost庫名,用於連結到目標程式
Boost_VERSION          - 從boost/version.hpp檔案獲取的版本號
Boost_LIB_VERSION      - 某個庫的版本

可以在搜尋package之前,通過設定一些變數來幫助boost庫的查詢

BOOST_ROOT             - 首選的Boost安裝路徑
BOOST_INCLUDEDIR       - 首選的標頭檔案搜尋路徑 e.g. <prefix>/include
BOOST_LIBRARYDIR       - 首選的庫檔案搜尋路徑 e.g. <prefix>/lib
Boost_NO_SYSTEM_PATHS  - 預設是OFF. 如果開啟了,則不會搜尋使用者指定路徑之外的路徑

示例程式

假如目標程式foo需要連結Boost庫regex和system,編寫如下的CMakeLists檔案,

# CMakeLists.txt
project(tutorial-0)
cmake_minimum_required(VERSION 3.5)
set(CMAKE_CXX_STANDARD 14)

set(BOOST_ROOT /usr/local/install/boost_1_61_0)

find_package(Boost COMPONENTS regex system REQUIRED)

if(Boost_FOUND)
    include_directories(${Boost_INCLUDE_DIRS})
    
    MESSAGE( STATUS "Boost_INCLUDE_DIRS = ${Boost_INCLUDE_DIRS}.")
    MESSAGE( STATUS "Boost_LIBRARIES = ${Boost_LIBRARIES}.")
    MESSAGE( STATUS "Boost_LIB_VERSION = ${Boost_LIB_VERSION}.")

    add_executable(foo foo.cpp)
    target_link_libraries (foo ${Boost_LIBRARIES})
endif()
  • 通過設定BOOST_ROOT來設定首選的搜尋路徑
  • 通過MESSAGE函式把查詢的結果都列印了出來
-- Boost_INCLUDE_DIRS = /usr/local/install/boost_1_61_0/include.
-- Boost_LIBRARIES = /usr/local/install/boost_1_61_0/lib/libboost_regex.so;/usr/local/install/boost_1_61_0/lib/libboost_system.so.
-- Boost_LIB_VERSION = 1_61.
  • 編譯過程需要用到的標頭檔案搜尋路徑儲存在變數Boost_INCLUDE_DIRS中,所需要link的庫檔案路徑儲存在變數Boost_LIBRARIES

參考連結

FindBoost