通过使用 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.mzph.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;如显卡驱动、虚拟化模块&…