CMake 与 Finder
學(xué)習(xí)一下cmake的 finder。
finder是神馬東西?
當(dāng)編譯一個(gè)需要使用第三方庫(kù)的軟件時(shí),我們需要知道:
去哪兒找頭文件 .h
?對(duì)比GCC的 -I 參數(shù)
?
去哪兒找?guī)煳募?(.so/.dll/.lib/.dylib/...)
?對(duì)比GCC的 -L 參數(shù)
?
需要鏈接的庫(kù)文件的名字
?對(duì)比GCC的 -l 參數(shù)
這也是一個(gè) finder 需要返回的最基本的信息。
如何使用?
比如說(shuō),我們需要一個(gè)第三方庫(kù) curl,那么我們的 CMakeLists.txt 需要指定頭文件目錄,和庫(kù)文件,類(lèi)似:
include_directiories(/usr/include)
target_link_libraries(myprogram curl)如果借助于cmake提供的finder會(huì)怎么樣呢?使用cmake的Modules目錄下的FindCURL.cmake,相應(yīng)的 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如何工作
find_package 將會(huì)在module路徑下查找 Find<name>.cmake。首先它搜索 ${CMAKE_MODULE_PATH}中的所有路徑,然后搜索 <CMAKE_ROOT>/share/cmake-x.y/Modules/
如果這個(gè)文件未找到,它將會(huì)查找 <Name>Config.cmake 或 <lower-case-name>-config.cmake 文件。這兩個(gè)文件是庫(kù)文件安裝時(shí)自己安裝的,將自己的路徑硬編碼到其中。
前者稱為 module 模式,后者稱為 config 模式
每個(gè)模塊一般都會(huì)提供一下幾個(gè)變量
?<name>_FOUND
?<name>_INCLUDE_DIR 或 <name>_INCLUDES
?<name>_LIBRARY 或 <name>_LIBRARIES 或 <name>_LIBS
?<name>_DEFINITIONS
編寫(xiě)finder
?首先使用 find_package 探測(cè)本軟件包依賴的第三方庫(kù)(參數(shù) QUIETLY 和 REQUIRED應(yīng)該被傳遞)
?如果 pkg-config 可用,則可以用其去探測(cè)include/library路徑
?分別使用 find_path 和 find_library 查找頭文件和庫(kù)文件
?pkg-config 提供的路徑僅作為參考
?CMake 有很多硬編碼的路徑
?結(jié)果放到 <name>_INCLUDE_DIR 和 <name>_LIBRARY (注意:單數(shù)而不是復(fù)數(shù))
?設(shè)置 <name>_INCLUDE_DIRS 為 <name>_INCLUDE_DIR <dependency1>_INCLUDE_DIRS ...
?設(shè)置 <name>_LIBRARIES 為 <name>_LIBRARY <dependency1>_LIBRARIES ...
?依賴使用復(fù)數(shù),包自身使用單數(shù)形式(由find_path和find_library提供)
?調(diào)用宏 find_package_handle_standard_args() 設(shè)置 <name>_FOUND 并打印或失敗信息
?
轉(zhuǎn)載于:https://www.cnblogs.com/xfei-zhang/p/5086851.html
總結(jié)
以上是生活随笔為你收集整理的CMake 与 Finder的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: c# 委托和事件(总结篇)
- 下一篇: 运用多种知识点实现一个综合小游戏