通過使用 include 語句加載并執行一個CMake腳本來引入第三方庫
當項目中使用到第三方庫時,可以通過使用 include 語句來加載并執行一個CMake腳本,在引入的CMake腳本中進行第三方庫的下載、構建和庫查找路徑的設置等操作,以這種方式簡化項目中依賴庫的配置。
通常在以 .cmake
為后綴的文件中寫CMake語句,稱之為CMake腳本。在CMake的語法中,使用 include 語句來引入并執行 CMake 腳本,語法形式為 include(<name>)
。該語句相當于在 include 的當前位置插入 CMake 腳本代碼,然后 CMake 腳本中的變量作用域(非函數內部)提升為當前cmake程序變量作用域。
執行 include(<name>)
語句時,CMake 會從 CMAKE_MODULE_PATH
內置變量指定的路徑中查找名為 .cmake 的文件,然后執行該文件中定義的 CMake 語句。在項目的目錄結構中,一般會有一個名為 cmake 的子目錄,用來保存 CMake 腳本,然后將 cmake 目錄的路徑添加到 CMAKE_MODULE_PATH
變量值中。
list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake)
下面給出一個簡單通用的模版:
項目根目錄下的 CMakeLists.txt 文件內容如下:
cmake_minimum_required(VERSION 3.16)
project(ONNXModel)
set(CMAKE_CXX_STANDARD 17)list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake)include(onnxruntime)
cmake目錄下的 onnxruntime.cmake 腳本
# cmake目錄下的 onnxruntime.cmake 腳本# 設置第三方庫的下載路徑和文件的 hash 值
set(URL "https://github.com/microsoft/onnxruntime/releases/download/v${ONNXRUNTIME_VERSION}/onnxruntime-osx-arm64-${ONNXRUNTIME_VERSION}.tgz")
set(URL_HASH "SHA256=5c3f2064ee97eb7774e87f396735c8eada7287734f1bb7847467ad30d4036115")# 如果不能連接互聯網,提前下載至本地
set(possible_file_locations "${CMAKE_SOURCE_DIR}/third-part/onnxruntime-osx-arm64-${ONNXRUNTIME_VERSION}.tgz")
if (EXISTS ${possible_file_locations})set(URL "${possible_file_locations}")file(TO_CMAKE_PATH "${URL}" URL)message(STATUS "Found local download onnxruntime: ${URL}")
endif()# 使用 FetchContent 模塊從指定鏈接中下載(并解壓)第三方庫
FetchContent_Declare(onnxruntimeURL ${URL}URL_HASH ${URL_HASH}
)
FetchContent_MakeAvailable(onnxruntime)# 在指定路徑中查找名為 onnxruntime 庫
# 并將庫的路徑賦值給變量 location_onnxruntime
find_library(location_onnxruntime onnxruntimePATHS"${onnxruntime_SOURCE_DIR}/lib"NO_CMAKE_SYSTEM_PATH
)
message(STATUS "onnxruntime library locate at ${location_onnxruntime}")# 將 onnxruntime 添加在動態庫
# IMPORTED 屬性表示該庫為外部構建的
add_library(onnxruntime SHARED IMPORTED)
# 設置 onnxruntime 庫的一些屬性
# IMPORTED_LOCATION 指定庫的路徑
# INTERFACE_INCLUDE_DIRECTORIES 指定接口目錄
# 即指定 include 的查找路徑
set_target_properties(onnxruntime PROPERTIESIMPORTED_LOCATION "${location_onnxruntime}"INTERFACE_INCLUDE_DIRECTORIES "${onnxruntime_SOURCE_DIR}/include"
)
小結
- 在CMake腳本中定義第三方庫的下載、構建和庫查找路徑的設置等設置,可以輕量化、方便的構建項目中依賴的第三方庫。
- 可以通過條件判斷 和 CMake 腳本的嵌套,即一個 CMake 腳本中 include 另一個 CMake 腳本來實現更復雜的項目構建。例如根據平臺架構來選擇 include 特定的 CMake 腳本。sherpa-onnx 是一個不錯的學習例子。