通過使用 include 語句加載并執行一個CMake腳本來引入第三方庫

通過使用 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 是一個不錯的學習例子。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/76912.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/76912.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/76912.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

DNS正反向解析復習,DNS主從服務,轉發服務及DNS和nginx聯合案例

正向解析 1、配置主機名 [rootlocalhost ~]# dnf install bash-completion -y #一個按tap鍵補全的軟件 [rootlocalhost ~]# hostnamectl hostname dns #改主機名為dns [rootlocalhost ~]# exit ssh root你的IP地址 要重啟才會生效2、安裝bind [rootdns ~]# dnf install b…

網絡安全·第一天·IP協議安全分析

本篇博客講述的是網絡安全中一些協議缺陷以及相應的理論知識&#xff0c;本博主盡可能講明白其中的一些原理以及對應的防衛措施。 學習考研408的同學也能進來看看&#xff0c;或許對考研有些許幫助&#xff08;按照考研現在的趨勢&#xff0c;年年都有新題目&#xff0c;本文當…

【詳解】Nginx配置WebSocket

目錄 Nginx配置WebSocket 簡介 準備工作 檢查 Nginx 版本 配置 Nginx 支持 WebSocket 修改 Nginx 配置文件 解釋配置項 測試配置 測試 WebSocket 連接 WebSocket 服務端 (Node.js) WebSocket 客戶端 (HTML JavaScript) 運行測試 Nginx 配置文件示例 解釋 測試配…

《軌道力學講義》——第八講:行星際軌道設計

第八講&#xff1a;行星際軌道設計 引言 行星際軌道設計是探索太陽系的核心技術&#xff0c;它涉及如何規劃和優化航天器從一個天體到另一個天體的飛行路徑。隨著人類探索太陽系的雄心不斷擴大&#xff0c;從最初的月球探測到火星探測&#xff0c;再到更遙遠的外太陽系探測&a…

操作系統學習筆記——[特殊字符]超詳細 | 如何喚醒被阻塞的 socket 線程?線程阻塞原理、線程池、fork/vfork徹底講明白!

&#x1f4a1;超詳細 | 如何喚醒被阻塞的 socket 線程&#xff1f;線程阻塞原理、線程池、fork/vfork徹底講明白&#xff01; 一、什么是阻塞&#xff1f;為什么線程會阻塞&#xff1f;二、socket線程被阻塞的典型場景&#x1f9e0; 解法思路&#xff1a; 三、線程的幾種阻塞狀…

第十六屆藍橋杯大賽軟件賽省賽 Python 大學 B 組 滿分題解

題面鏈接Htlang/2025lqb_python_b 個人覺得今年這套題整體比往年要簡單許多&#xff0c;但是G題想簡單了出大問題&#xff0c;預估50101015120860&#xff0c;道阻且長&#xff0c;再接再厲 代碼僅供學習參考&#xff0c;滿分為賽后洛谷中的測評&#xff0c;藍橋杯官方測評待…

若依代碼生成器原理velocity模板引擎(自用)

1.源碼分析 代碼生成器:導入表結構(預覽、編輯、刪除、同步)、生成前后端代碼 代碼生成器表結構說明&#xff1a; 若依提供了兩張核心表來存儲導入的業務表信息&#xff1a; gen_table&#xff1a;存儲業務表的基本信息 &#xff0c;它對應于配置代碼基本信息和生成信息的頁…

如何制定有效的風險應對計劃

制定有效的風險應對計劃的核心在于&#xff1a; 識別潛在風險、評估風險的影響與概率、選擇合適的應對策略、建立動態監控和反饋機制。 其中&#xff0c;識別潛在風險是最為關鍵的第一步。只有準確識別出可能的風險&#xff0c;才能在后續的評估、應對、監控等環節中做到有的放…

A2A協議實現詳解及示例

A2A協議概述 A2A (Agent2Agent) 是Google推出的一個開放協議&#xff0c;旨在使AI智能體能夠安全地相互通信和協作。該協議打破了孤立智能體系統之間的壁壘&#xff0c;實現了復雜的跨應用自動化。[1] A2A協議的核心目標是讓不同的AI代理能夠相互通信、安全地交換信息以及在各…

【中級軟件設計師】前趨圖 (附軟考真題)

【中級軟件設計師】前趨圖 (附軟考真題) 目錄 【中級軟件設計師】前趨圖 (附軟考真題)一、歷年真題三、真題的答案與解析答案解析 復習技巧&#xff1a; 若已掌握【前趨圖】相關知識&#xff0c;可直接刷以下真題&#xff1b; 若對知識一知半解&#xff0c;建議略讀題目&#x…

調節磁盤和CPU的矛盾——InnoDB的Buffer Pool

緩存的重要性 無論是用于存儲用戶數據的索引【聚簇索引、二級索引】還是各種系統數據&#xff0c;都是以頁的形式存放在表空間中【對一個/幾個實際文件的抽象&#xff0c;存儲在磁盤上】如果需要訪問某頁的數據&#xff0c;就會把完整的頁數據加載到內存中【即使只訪問頁中的一…

springboot和springcloud的區別

1. ?目的與功能? ?1)Spring Boot?: 主要用于快速構建獨立的、生產級的 Spring 應用程序。它通過自動配置和嵌入式服務器等特性,簡化了微服務的開發、啟動和部署,使開發者能夠專注于業務邏輯而非繁瑣的配置。?Spring Boot是一個快速開發的框架,旨在簡化Java應用程序的開…

耘想WinNAS:以聊天交互重構NAS生態,開啟AI時代的存儲革命

一、傳統NAS的交互困境與范式瓶頸 在傳統NAS&#xff08;網絡附加存儲&#xff09;領域&#xff0c;用戶需通過復雜的圖形界面或命令行工具完成文件管理、權限配置、數據檢索等操作&#xff0c;學習成本高且效率低下。例如&#xff0c;用戶若需搜索特定文件&#xff0c;需手動…

在斷網的時候,websocket 一直在CLOSING 狀態

現象 websocket 先連接成功&#xff0c;然后斷網。 由于維護了一套心跳機制&#xff0c;前端發起心跳&#xff0c;如果一段時間內沒有收到服務端返回的心跳。則表示連接斷開。 用心跳的方式處理斷網的兜底情況。 然而&#xff0c;此時網絡是斷開的&#xff0c;在代碼中直接調…

基于AWS的大模型調用場景:10大成本優化實戰方案

大模型訓練與推理是AI領域的計算密集型場景&#xff0c;如何在AWS上實現高性能與低成本的雙重目標&#xff1f;本文從實例選型、彈性伸縮、存儲優化等角度&#xff0c;分享10個經過驗證的AWS成本優化策略&#xff0c;幫助企業節省30%以上成本。 一、大模型場景的成本痛點分析 計…

【網絡原理】TCP/IP協議五層模型

目錄 一. 協議的分層 二. OSI七層網絡協議 三. TCP/IP五層網絡協議 四. 網絡設備所在分層 五. 封裝 六. 分用 七. 傳輸中的封裝和分用 八. 數據單位術語 一. 協議的分層 常見的分層為兩種OSI七層模型和TCP/IP五層模型 為什么要協議分層&#xff1f; 在網絡通信中&…

科技快訊 | 阿里云百煉MCP服務上線;英偉達官宣:CUDA 工具鏈將全面原生支持 Python

李飛飛團隊最新AI報告&#xff1a;中美模型性能差距近乎持平 4月8日&#xff0c;斯坦福大學以人為本人工智能研究所發布《2025年人工智能指數報告》。報告顯示&#xff0c;2023年AI性能顯著提升&#xff0c;AI應用加速&#xff0c;投資增長&#xff0c;中美AI模型差距縮小。報告…

貓咪如廁檢測與分類識別系統系列【三】融合yolov11目標檢測

? 前情提要 家里養了三只貓咪&#xff0c;其中一只布偶貓經常出入廁所。但因為平時忙于學業&#xff0c;沒法時刻關注牠的行為。我知道貓咪的如廁頻率和時長與健康狀況密切相關&#xff0c;頻繁如廁可能是泌尿問題&#xff0c;停留過久也可能是便秘或不適。為了更科學地了解牠…

2025年燃氣證書:傳承與發展的行業紐帶

回溯歷史長河&#xff0c;能源的利用與人類文明的發展息息相關。從遠古時期的鉆木取火&#xff0c;到如今廣泛應用的燃氣能源&#xff0c;每一次能源的變革都推動著社會的巨大進步。而在現代燃氣行業蓬勃發展的背后&#xff0c;燃氣從業人員資格證書正扮演著傳承與發展的重要紐…

在Ubuntu下進行單片機開發是否需要關閉Secure Boot

1. Secure Boot的作用 功能&#xff1a;Secure Boot是UEFI的安全功能&#xff0c;旨在阻止未經驗證的驅動或操作系統啟動&#xff0c;防止惡意軟件篡改引導過程。 影響范圍&#xff1a;它主要限制的是操作系統啟動階段加載的內核級驅動&#xff08;如顯卡驅動、虛擬化模塊&…