cmake 學習筆記(三)
接前面的 Cmake學習筆記(一) 與 Cmake學習筆記(二) 繼續學習 cmake 的使用。
學習一下cmake的 finder。
當編譯一個需要使用第三方庫的軟體時,我們需要知道:
去哪兒找標頭檔案 .h | 對比GCC的 -I 引數 |
去哪兒找庫檔案 (.so/.dll/.lib/.dylib/...) | 對比GCC的 -L 引數 |
需要連結的庫檔案的名字 | 對比GCC的 -l 引數 |
這也是一個 finder 需要返回的最基本的資訊。
比如說,我們需要一個第三方庫 curl,那麼我們的 CMakeLists.txt 需要指定標頭檔案目錄,和庫檔案,類似:
include_directiories(/usr/include)
target_link_libraries(myprogram curl)
如果藉助於cmake提供的finder會怎麼樣呢?使用cmake的Modules目錄下的FindCURL.cmake,相應的 CMakeList.txt 檔案:
find_package(CURL REQUIRED)
include_directories(${CURL_INCLUDE_DIR})
target_link_libraries(curltest ${CURL_LIBRARY})
或者
find_package(CURL)
if(CURL_FOUND)
include_directories(${CURL_INCLUDE_DIR})
target_link_libraries(curltest ${CURL_LIBRARY})
else(CURL_FOUND)
message(FATAL_ERROR "curl not found!")
endif(CURL_FOUND)
如果我們使用的finder,不是cmake自帶的怎麼辦?
- 放置位置:工程根目錄下的 cmake/Modules/
- 然後在 CMakeList.txt 中新增
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/")
find_package 將會在module路徑下查詢 Find<name>.cmake。首先它搜尋 ${CMAKE_MODULE_PATH}中的所有路徑,然後搜尋 <CMAKE_ROOT>/share/cmake-x.y/Modules/
如果這個檔案未找到,它將會查詢 <Name>Config.cmake 或 <lower-case-name>-config.cmake 檔案。這兩個檔案是庫檔案安裝時自己安裝的,將自己的路徑硬編碼到其中。
前者稱為 module 模式,後者稱為 config 模式
每個模組一般都會提供一下幾個變數
<name>_FOUND
<name>_INCLUDE_DIR 或 <name>_INCLUDES
<name>_LIBRARY 或 <name>_LIBRARIES 或 <name>_LIBS
<name>_DEFINITIONS
首先使用 find_package 探測本軟體包依賴的第三方庫(引數 QUIETLY 和 REQUIRED應該被傳遞)
如果 pkg-config 可用,則可以用其去探測include/library路徑
-
分別使用 find_path 和 find_library 查詢標頭檔案和庫檔案
- pkg-config 提供的路徑僅作為參考
- CMake 有很多硬編碼的路徑
- 結果放到 <name>_INCLUDE_DIR 和 <name>_LIBRARY (注意:單數而不是複數)
設定 <name>_INCLUDE_DIRS 為 <name>_INCLUDE_DIR <dependency1>_INCLUDE_DIRS ...
-
設定 <name>_LIBRARIES 為 <name>_LIBRARY <dependency1>_LIBRARIES ...
- 依賴使用複數,包自身使用單數形式(由find_path和find_library提供)
呼叫巨集 find_package_handle_standard_args() 設定 <name>_FOUND 並列印或失敗資訊
相關文章
- cmake學習筆記(五)筆記
- CMake構建學習筆記1-概述筆記
- cmake筆記筆記
- React 學習筆記【三】React筆記
- goLang學習筆記(三)Golang筆記
- unity學習筆記(三)Unity筆記
- ONNXRuntime學習筆記(三)筆記
- Python學習筆記(三)Python筆記
- Redis學習筆記(三) 字典Redis筆記
- TS學習筆記(三):類筆記
- CANopen學習筆記(三)NMT筆記
- c++學習筆記(三)C++筆記
- react native學習筆記(三)React Native筆記
- CMake構建學習筆記16-使用VS進行CMake專案的開發筆記
- CMake構建學習筆記13-opencv庫的構建筆記OpenCV
- CMake構建學習筆記10-OsgQt庫的構建筆記QT
- CMake構建學習筆記6-giflib庫的構建筆記
- CMake構建學習筆記7-freetype庫的構建筆記
- CMake構建學習筆記8-OpenSceneGraph庫的構建筆記
- CMake構建學習筆記9-Eigen庫的構建筆記
- CMake構建學習筆記4-libjpeg庫的構建筆記
- CMake構建學習筆記5-libtiff庫的構建筆記
- CMake構建學習筆記2-zlib庫的構建筆記
- CMake構建學習筆記3-libpng庫的構建筆記
- CMake構建學習筆記11-minizip庫的構建筆記
- CMake構建學習筆記12-libzip庫的構建筆記
- 架構學習筆記系列三架構筆記
- ES6 學習筆記三筆記
- Spark學習筆記(三)-Spark StreamingSpark筆記
- Python爬蟲學習筆記(三)Python爬蟲筆記
- CMake構建學習筆記18-cpp-httplib庫的構建筆記HTTP
- CMake構建學習筆記17-uriparser庫的構建和使用筆記
- redis學習筆記(三)–Redis的功能Redis筆記
- iOS學習筆記43 Swift(三)類iOS筆記Swift
- springcloud學習筆記(三)Spring Cloud RibbonSpringGCCloud筆記
- 樹莓派學習筆記(三)PyTorch樹莓派筆記PyTorch
- TCP 學習筆記(三) 可靠傳輸TCP筆記
- CMake構建學習筆記14-依賴庫管理工具筆記