当前位置: 首页 > news >正文

如何优雅的使用CMake中的FindPkgConfig模块

背景

如果你遇到下面的场景,那么FindPkgConfig模块可以用来解决我们引用上游库的问题。

  • 上游库没有提供CMake的配置文件。
  • CMake没有提供相应的查找模块,即Find<PackageName>.cmake的文件。
  • 上游库提供了pkg-config使用的.pc文件。

如果上面三个条件都不满足,不用担心,可以参考《Linux中使用CMake导入第三方开发库》导入上游库。

FindPkgConfig模块介绍

FindPkgConfig模块提供了pkg_get_variable(), pkg_check_modules()pkg_search_module()三个命令。普通用户还是接触后两个命令最多。

pkg_check_modules()pkg_search_module()的签名一样。不同之处在于pkg_check_modules()要求每个<moduleSpec>都满足要求,才认为命令执行成功,而pkg_search_module()要求只要有一个<moduleSpec>满足要求,命令就算执行成功。

pkg_check_modules(<prefix>[REQUIRED] [QUIET][NO_CMAKE_PATH][NO_CMAKE_ENVIRONMENT_PATH][IMPORTED_TARGET [GLOBAL]]<moduleSpec> [<moduleSpec>...])pkg_search_module(<prefix>[REQUIRED] [QUIET][NO_CMAKE_PATH][NO_CMAKE_ENVIRONMENT_PATH][IMPORTED_TARGET [GLOBAL]]<moduleSpec> [<moduleSpec>...])

举一个实际例子,说明pkg_check_modules()pkg_search_module()之间的差异。

include(FindPkgConfig)
pkg_check_modules(CHECK_DEPS REQUIRED gtk+-3.0 glib-2.0)# 必须gtk+-3.0和glib-2.0都存在,CHECK_DEPS_FOUND的值才为TRUE
if(CHECK_DEPS_FOUND)message(STATUS "找到 GTK3 和 Glib2")
else()message(WARNING "未找到依赖库!")
endif()# 只要gtk+-3.0或glib-2.0存在,SEARCH_DEPS_FOUND的值为TRUE
pkg_search_modules(SEARCH_DEPS REQUIRED gtk+-3.0 glib-2.0)if(SEARCH_DEPS_FOUND)message(STATUS "找到 GTK3 或 Glib2")
else()message(WARNING "未找到依赖库!")
endif()

如果需要检测的<moduleSpec>只有一个,那这两个命令的实际使用效果是一样的。

基本用法

pkg_check_modules()为例,大部分的用法如下所示。借助该模块提供的变量<XXX>_LIBRARY_DIRS<XXX>_LIBRARIES<XXX>_INCLUDE_DIRS,在项目中使用上游库。

cmake_minimum_required(VERSION 3.10)
project(MyGTKApp)include(FindPkgConfig)
pkg_check_modules(GTK3 REQUIRED gtk+-3.0>=3.18)add_executable(my_app main.c)
# 包含头文件路径
target_include_directories(my_app PRIVATE ${GTK3_INCLUDE_DIRS})
# 链接库路径和库文件
target_link_directories(my_app PRIVATE ${GTK3_LIBRARY_DIRS})
target_link_libraries(my_app PRIVATE ${GTK3_LIBRARIES})

进阶用法

其实,pkg_check_modules()提供了符合CMake风格的用法,使用IMPORTED_TARGET参数将上游库以PkgConfig::<prefix>的名称,作为一个导入目标(imported target),直接使用target_link_libraries()命令链接PkgConfig::<prefix>即可。可以与上面的基本用法对比,写法更加简洁、专业。
如果我们需要这个导入的上游库在整个项目中可见(可用),可以在IMPORTED_TARGET后追加一个参数GLOBAL

cmake_minimum_required(VERSION 3.13)
project(MyGTKApp)include(FindPkgConfig)
pkg_check_modules(GTK3 REQUIRED IMPORTED_TARGET [GLOBAL] gtk+-3.0>=3.18)add_executable(my_app main.c)
target_link_libraries(my_app PRIVATE PkgConfig::GTK3)

IMPORTED_TARGET的内部实现

查看/usr/share/cmake-3.22/Modules/FindPkgConfig.cmake这个文件的_pkg_create_imp_target函数,我们可以看到使用IMPORTED_TARGET时,CMake到底做了什么。源码一看,原来也是简单命令的组合,只是CMake帮我们写了很多。

# create an imported target from all the information returned by pkg-config
function(_pkg_create_imp_target _prefix _imp_target_global)if (NOT TARGET PkgConfig::${_prefix})if(${_imp_target_global})set(_global_opt "GLOBAL")else()unset(_global_opt)endif()add_library(PkgConfig::${_prefix} INTERFACE IMPORTED ${_global_opt})if(${_prefix}_INCLUDE_DIRS)set_property(TARGET PkgConfig::${_prefix} PROPERTYINTERFACE_INCLUDE_DIRECTORIES "${${_prefix}_INCLUDE_DIRS}")endif()if(${_prefix}_LINK_LIBRARIES)set_property(TARGET PkgConfig::${_prefix} PROPERTYINTERFACE_LINK_LIBRARIES "${${_prefix}_LINK_LIBRARIES}")endif()if(${_prefix}_LDFLAGS_OTHER)set_property(TARGET PkgConfig::${_prefix} PROPERTYINTERFACE_LINK_OPTIONS "${${_prefix}_LDFLAGS_OTHER}")endif()if(${_prefix}_CFLAGS_OTHER)set_property(TARGET PkgConfig::${_prefix} PROPERTYINTERFACE_COMPILE_OPTIONS "${${_prefix}_CFLAGS_OTHER}")endif()endif()
endfunction()

参考资料

https://cmake.org/cmake/help/latest/module/FindPkgConfig.html

最后

分享CMake使用中的小技巧。如果文章对您有帮助,不妨关注、收藏和转发,感谢。

相关文章:

如何优雅的使用CMake中的FindPkgConfig模块

背景 如果你遇到下面的场景&#xff0c;那么FindPkgConfig模块可以用来解决我们引用上游库的问题。 上游库没有提供CMake的配置文件。CMake没有提供相应的查找模块&#xff0c;即Find<PackageName>.cmake的文件。上游库提供了pkg-config使用的.pc文件。 如果上面三个条…...

Docker Volumes

Docker Volumes 是 Docker 提供的一种机制&#xff0c;用于持久化存储容器数据。与容器的生命周期不同&#xff0c;Volumes 可以独立存在&#xff0c;即使容器被删除&#xff0c;数据仍然保留。以下是关于 Docker Volumes 的详细说明&#xff1a; 1. 为什么需要 Volumes&#…...

[原创](现代Delphi 12指南):[macOS 64bit App开发]: 如何获取当前用户主目录(即:~波浪符号目录)?

[作者] 常用网名: 猪头三 出生日期: 1981.XX.XX 企鹅交流: 643439947 个人网站: 80x86汇编小站 编程生涯: 2001年~至今[共24年] 职业生涯: 22年 开发语言: C/C++、80x86ASM、Object Pascal、Objective-C、C#、R、Python、PHP、Perl、 开发工具: Visual Studio、Delphi、XCode、…...

day23 机器学习管道 Pipeline

在机器学习中&#xff0c;数据预处理、特征提取、模型训练和评估等步骤通常是按顺序执行的。为了更高效地管理和复用这些步骤&#xff0c;我们可以使用 Pipeline&#xff08;管道&#xff09;来构建一个完整的机器学习流水线。本文将详细介绍 Pipeline 的基础概念&#xff0c;并…...

The Graph:区块链数据索引的技术架构与创新实践

作为Web3生态的核心基础设施&#xff0c;The Graph通过去中心化索引协议重塑了链上数据访问的范式。其技术设计不仅解决了传统区块链数据查询的效率瓶颈&#xff0c;还通过经济模型与多链兼容性构建了一个开放的开发者生态。本文从技术角度解析其架构、机制及创新实践。 一、技…...

nginx配置sse流传输问题:直到所有内容返回后才往下传输

一、禁用缓冲&#xff08;如实时流传输&#xff09;&#xff1a; location /stream {proxy_buffering off; } 二、开启分块传输 location /your-path {proxy_chunked_transfer_encoding on; # 显式启用分块传输&#xff08;默认已启用&#xff09; }...

使用Daemonset部署日志收集守护进程

1.DaemonSet简介&#xff1a; 在Kubernetes&#xff08;简称k8s&#xff09;中&#xff0c;DaemonSet是一种控制器&#xff0c;用于确保集群中的每个&#xff08;或部分&#xff09;节点运行一个指定的Pod副本。DaemonSet非常适合需要全局部署、节点级运行的服务&#xff0c;如…...

在Mac环境下搭建Docker环境的全攻略

在Mac环境下搭建Docker环境的全攻略 在现代软件开发中&#xff0c;Docker已经成为不可或缺的工具之一。它不仅简化了应用的部署和管理&#xff0c;还极大地提升了开发效率。然而&#xff0c;在某些公司环境中&#xff0c;桌面版的Docker可能会被禁用&#xff0c;这给开发工作带…...

Go 语言 slice(切片) 的使用

序言 在许多开发语言中&#xff0c;动态数组是必不可少的一个组成部分。在实际的开发中很少会使用到数组&#xff0c;因为对于数组的大小大多数情况下我们是不能事先就确定好的&#xff0c;所以他不够灵活。动态数组通过提供自动扩容的机制&#xff0c;极大地提升了开发效率。这…...

C++ string比较、string随机访问、string字符插入、string数据删除

string的字符串进行比较&#xff0c;代码见下。 #include<iostream>using namespace std;int main() {// 1 comparestring s1 "aab";string t11 "aab";int r11 s1.compare(t11);cout << "1: " << r11 << endl;strin…...

web 自动化之 Unittest 应用:测试报告装饰器断言

文章目录 一、常见的第三方库结合 unittest 生产 html 格式测试报告1、HtmlTestRunner2、BeatifulReport 二、装饰器 unittest.skip 强制跳过&条件跳过三、unittest的常用断言方法 一、常见的第三方库结合 unittest 生产 html 格式测试报告 1、HtmlTestRunner 官网下载 …...

前端基础之《Vue(16)—Vue脚手架介绍》

一、脚手架环境 1、推荐windows10 Node vue/cli(webpack) 2、测试node安装成功 node -v npm -v 3、什么是脚手架 Vue CLI&#xff1a;CLI就是脚手架的意思 脚手架生成一套模板&#xff08;入口文件、配置文件、目录结构&#xff09; 4、常用的包管理器 npm&#xff1a;no…...

MySQL 事务(一)

文章目录 CURD不加控制&#xff0c;会有什么问题CURD满足什么属性&#xff0c;能解决上述问题&#xff1f;什么是事务为什么要有事务事务的版本支持了解事务的提交方式 事务常见操作方式研究并发场景事务的正常操作事务的非正常情况的案例结论事务操作的注意事项 CURD不加控制&…...

Dsp38335利用Bootloader实现在线升级的技术原理

1. Bootloader概述 Bootloader&#xff08;引导加载程序&#xff09;是嵌入式系统中负责在设备启动时加载和启动主程序的代码。它通常在系统的闪存或其他非易失性存储器中&#xff0c;并在系统上电时首先执行。Bootloader不仅完成启动操作&#xff0c;还能够提供后续的程序升级…...

【TVM 教程】microTVM PyTorch 教程

Apache TVM 是一个深度的深度学习编译框架&#xff0c;适用于 CPU、GPU 和各种机器学习加速芯片。更多 TVM 中文文档可访问 →https://tvm.hyper.ai/ 作者&#xff1a;Mehrdad Hessar 该教程展示了如何使用 PyTorch 模型进行 microTVM 主机驱动的 AOT 编译。此教程可以在使用…...

利用D435i相机进行SLAM实现建图的关键环节-----Kalibr标定工具以及常见的问题调试

在SLAM系统中&#xff0c;相机标定是获取准确的空间信息和三维重建的关键步骤。对于Intel RealSense D435i这类双目相机&#xff0c;正确的内参和外参不仅能提高位姿估计精度&#xff0c;还能显著改善重建效果。本文将详细介绍如何使用Kalibr对D435i进行双目标定&#xff0c;并…...

old kali网站下载链接爬取-Kali linux 全部版本镜像下载--Index of /kali-images

Kali linux 全部版本镜像下载 目的 出于该网站不稳定原因&#xff0c;故爬取下载链接&#xff0c;以便网友下载老版本kali from bs4 import BeautifulSoup import requests from urllib.parse import urljoinbase_url "http://old.kali.org/kali-images/" visite…...

基于千眼狼高速摄像机与三色掩模的体三维粒子图像测速PIV技术

研究背景 航空航天、能源动力领域&#xff0c;测量三维瞬态流场的速度场信息对于理解流体力学行为、优化系统设计非常关键。 传统三维粒子图像测速技术如Tomo层析PIV&#xff0c;因依赖多相机阵列&#xff0c;存在系统体积、操作复杂&#xff0c;在封闭空间测量存在困难&#…...

Tauri(2.5.1)+Leptos(0.7.8)开发桌面应用--程序启动界面

前期使用Tauri(2.5.1)Leptos(0.7.8)写了一个自用桌面小程序&#xff0c;详见&#xff1a;使用Tauri 2.3.1Leptos 0.7.8开发桌面小程序汇总_tauri 小程序-CSDN博客。 在此基础上&#xff0c;尝试给程序添加启动界面&#xff0c;效果如下图所示。 1. 添加启动画面设置 在src-ta…...

Gmsh划分网格|四点矩形

先看下面这段官方自带脚本 /*********************************************************************** Gmsh tutorial 1** Variables, elementary entities (points, curves, surfaces), physical* entities (points, curves, surfaces)********************************…...

I/O多路复用(select/poll/epoll)

通过一个进程来维护多个Socket&#xff0c;也就是I/O多路复用&#xff0c;是一种常见的并发编程技术&#xff0c;它允许单个线程或进程同时监视多个输入/输出&#xff08;I/O&#xff09;流&#xff08;例如网络连接、文件描述符&#xff09;。当任何一个I/O流准备好进行读写操…...

一键生成达梦、Oracle、MySQL 数据库 ER 图!解锁高效数据库设计!

从事企业软件项目开发的同学们一定对 ER 图很熟悉&#xff0c;可以帮助用户快速厘清数据库结构&#xff0c;方便后续维护和优化。但是在日常工作中&#xff0c;面对复杂的数据结构&#xff0c;整理表设计文档对于每一位DBA来说都很头大&#xff0c;需要将设计细节转化为条理清晰…...

学习黑客 windows 设置与控制面板详解

Windows 设置与控制面板详解&#xff1a;双剑合璧的系统配置工具 ⚙️&#x1f527; 学习目标&#xff1a;理解Windows设置和控制面板的异同、掌握系统配置的安全最佳实践 1. 引言&#xff1a;双界面的系统配置世界 &#x1f310; 在Windows操作系统中&#xff0c;有两个强大的…...

pytorch模型画质增强简单实现

使用数据增强技术可以增加数据集中图像的多样性&#xff0c;从而提高模型的性能和泛化能力&#xff0c;主要的图像增强技术包括。 亮度&#xff0c;对比度调节 在开始图像大小的调整之前我们需要导入数据&#xff08;图像以眼底图像为例&#xff09;。 from PIL import Image f…...

C++中的std::allocator

C中的std::allocator 文章目录 C中的std::allocator1.std::allocator1.1C中的placement new 和operator new1.2一个custom allocator的实现1.3使用std::allocator_traits实现allocator 1.std::allocator C中的std::allocator默默工作在CSTL中的所有容器的内存分配上&#xff0…...

Linux文件编程——read函数与lseek函数

一、read函数 在 Linux 文件编程中&#xff0c;read 函数是一个系统调用&#xff0c;用于从文件描述符&#xff08;File Descriptor&#xff09;指向的文件或设备中读取数据到缓冲区。它是 Unix/Linux 系统编程中实现底层 I/O 操作的核心函数之一。以下是 read 函数的详细使用…...

STM32 变量存储

一、存储区划分与变量分类 STM32的存储空间分为Flash&#xff08;非易失性&#xff09;和RAM&#xff08;易失性&#xff09;两大区域&#xff1a; ​Flash存储器 ​代码段&#xff08;Code&#xff09;​&#xff1a;存储程序指令和常量&#xff08;如字符串、const变量&…...

解锁性能密码:Linux 环境下 Oracle 大页配置全攻略​

在 Oracle 数据库运行过程中&#xff0c;内存管理是影响其性能的关键因素之一。大页内存&#xff08;Large Pages&#xff09;作为一种优化内存使用的技术&#xff0c;能够显著提升 Oracle 数据库的运行效率。本文将深入介绍大页内存的相关概念&#xff0c;并详细阐述 Oracle 在…...

HashMap中哈希值与数组坐标的关联

目录 1、哈希值的生成与处理 2、计算桶的索引 3、哈希值总结 4、哈希冲突解决方案 4.1. 拉链法&#xff08;Separate Chaining&#xff09; 4.2. 开放寻址法&#xff08;Open Addressing&#xff09; 1、线性探测&#xff08;Linear Probing&#xff09; 2、二次探测&a…...

GBK与UTF-8编码问题(1)

1. 问题现象 我们在编译.py的python代码时&#xff0c;有时会遇到如下图这种问题。提示说“SyntaxError: (unicode error) ‘utf-8’ codec can’t decode byte 0xc4 in position 0: invalid continuation byte”&#xff0c;代码中有中文字符&#xff0c;这似乎和文件的编码方…...

大模型的实践应用41-天气预测与分析决策系统:Qwen3(32B)+langchain框架+MCP(大模型上下文协议)+RAG+传统算法

大家好,我是微学AI,今天给大家介绍一下大模型的实践应用41-Qwen3(32B)+langchain框架+MCP(大模型上下文协议)+RAG+传统算法研发天气预测与分析决策系统。本项目构建一个基于大模型Qwen3(32B)、LangChain框架、MCP协议、RAG技术以及传统算法的天气预测与分析决策系统。该系统通…...

单片机学习Day08--相邻流水灯

一&#xff0c;题目&#xff1a;同时点亮相邻的两个灯&#xff0c;并实现流水设计。 亮的是0&#xff1b; 最前面是LED8. #include <REGX51.H> typedef unsigned int u16; typedef unsigned char u8; #define led P2 void delay_10us(u16 t) { while(t--); } void mai…...

邮件营销应对高退信率的策略

一、邮件列表管理 1. 使用专业工具验证 借助如 Geeksend 邮箱验证等专业工具&#xff0c;全面清洗邮件列表&#xff0c;剔除无效、过期或格式错误的邮箱地址&#xff0c;确保邮件精准送达有效收件人&#xff0c;从而降低退信率。 2. 定期清理无效地址 将定期清理邮件列表纳入…...

无线定位之 三 SX1302 网关源码 thread_gps 线程详解

前言 笔者计划通过无线定位系列文章、系统的描述 TDOA 无线定位和混合定位相关技术知识点, 并以实践来验证此定位系统精度。 笔者从实践出发、本篇直接走读无线定位系统关键节点、网关 SX1302 源码框架,并在源码走读过程 中、着重分析与无线定位相关的PPS时间的来龙去脉、并在…...

Kubernetes控制平面组件:Kubelet详解(一):API接口层介绍

云原生学习路线导航页&#xff08;持续更新中&#xff09; kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计&#xff08;一&#xff09;Kubernetes架构原则和对象设计&#xff08;二&#xff09;Kubernetes架构原则和对象设计&#xff08;三&#xff09;Kubernetes控…...

Java项目层级介绍 java 层级 层次

java 层级 层次 实体层 控制器层 数据连接层 Service : 业务处理类 Repository &#xff1a;数据库访问类 Java项目层级介绍 https://blog.csdn.net/m0_67574906/article/details/145811846 在Java项目中&#xff0c;层级结构&#xff08;Layered Architecture&#xf…...

【操作系统】零拷贝技术

1. DMA技术 DMA技术也就是直接内存访问技术。在进行I/O设备和内存的数据传输的时候&#xff0c;数据传输的工作全部交给DMA控制器&#xff0c;而不是CPU负责。 2. 传统的文件传输 传统的文件传输的代码如下&#xff1a; read(file, tmp_buf, len); write(socket, tmp_buf,…...

从零构建高性能桌面应用:GPUI Component全解析与实战指南

简介 高性能UI组件库正在重塑桌面应用开发的格局,而GPUI Component作为新兴的Rust桌面UI组件库,凭借其卓越的跨平台支持能力、GPU加速渲染和企业级功能特性,正成为构建现代化高性能桌面应用的首选。本文将从零开始,全面解析GPUI Component的核心特性、安装配置流程,并通过…...

java 中 DTO 和 VO 的核心区别

DTO 和 VO 的核心区别 特性DTO&#xff08;数据传输对象&#xff09;VO&#xff08;视图对象&#xff09;设计目的服务层与外部系统&#xff08;如前端、其他服务&#xff09;之间的数据传输为前端展示层定制数据&#xff0c;通常与 UI 强绑定数据内容可能包含业务逻辑需要的字…...

bazel迁移cmake要点及具体迁移工程示例(apollo radar)

文章目录 bazel迁移cmake要点及具体迁移工程示例迁移要点指南依赖库管理proto编译目标库及二进制文件生成项目导出runtime_data软件打包 conti_rardar完整迁移过程common_msgcommoncanbusconti_radar编译 bazel迁移cmake要点及具体迁移工程示例 迁移要点指南 迁移主要的内容包…...

跨时钟域(CDC,clock domain crossing)信号处理

参考视频&#xff1a; 数字IC&#xff0c;FPGA秋招【单bit信号的CDC跨时钟域处理手撕代码合集】_哔哩哔哩_bilibili 一、亚稳态 原因是&#xff1a;建立时间和保持时间没有保持住。然后在下图的红框里面&#xff0c;产生亚稳态。因为电路反馈机制&#xff0c;最后大概率会恢复…...

Java高频面试之并发编程-16

hello啊&#xff0c;各位观众姥爷们&#xff01;&#xff01;&#xff01;本baby今天又来报道了&#xff01;哈哈哈哈哈嗝&#x1f436; 面试官&#xff1a;volatile 实现原理是什么&#xff1f; volatile 关键字的实现原理 volatile 是 Java 中用于解决多线程环境下变量可见性…...

MyBatis 一对多关联映射在Spring Boot中的XML配置

在Spring Boot中使用MyBatis实现一对多关系时&#xff0c;可以通过XML映射文件来配置。下面我将详细介绍几种实现方式。 基本概念 一对多关系指的是一个实体对象包含多个子对象集合的情况&#xff0c;例如&#xff1a; 一个部门有多个员工一个订单有多个订单项一个博客有多个…...

Spring Boot异步任务失效的8大原因及解决方案

Spring Boot异步任务失效的8大原因及解决方案 摘要:在使用Spring Boot的@Async实现异步任务时,你是否遇到过异步不生效的问题?本文总结了8种常见的异步失效场景,并提供对应的解决方案,帮助你彻底解决异步任务失效的难题。 一、异步失效的常见场景 1. 未启用异步支持 ❌ …...

嵌入式Linux I2C驱动开发详解

文章目录 一、I2C协议的核心原理 1. I2C协议的“双线制”通信 2. I2C的地址寻址机制 二、Linux I2C驱动框架的分层设计 1. I2C核心 2. I2C适配器 3. I2C设备驱动 三、I2C驱动开发测试 一、I2C协议的核心原理 1. I2C协议的“双线制”通信 SDA&#xff08;数据线&#xff09; 和…...

基于 Spring Boot 瑞吉外卖系统开发(十二)

基于 Spring Boot 瑞吉外卖系统开发&#xff08;十二&#xff09; 菜品删除 单击“批量删除”和“删除”时&#xff0c;会携带需要删除的菜品的id以delete请求方式向“/dish”发送请求。 URLhttp://127.0.0.1:8080/dish调用方法DELETE参数ids DishController添加删除方法 …...

基于 51 单片机的 PWM 电机调速系统实现

51 单片机通过定时器来实现 PWM(脉冲宽度调制)控制,这是一种通过调整方波信号的占空比来控制输出功率的技术。下面详细介绍如何使用 51 单片机实现 PWM 控制并应用于电机调速。 1. PWM 控制原理 PWM 信号是一个周期性的方波,通过调整高电平时间(Ton)与周期(T)的比例(…...

wordpress主题分享

发布于&#xff1a;Eucalyptus-Blog 一、引言 大家对WordPress免费主题都非常感兴趣&#xff0c;但是一般收费的WordPress主题功能才多&#xff0c;其实有很多开源的免费WordPress主题都很不错&#xff0c;对于很多新建站的小伙伴&#xff0c;这些主题完全足够用了。这里就分享…...

【合新通信】无人机天线拉远RFOF(射频光纤传输)解决方案

无人机天线拉远RFOF方案通过光纤替代传统射频电缆&#xff0c;实现无人机与地面控制站之间的高保真、低损耗信号传输&#xff0c;尤其适用于高频段&#xff08;如毫米波&#xff09;、远距离或复杂电磁环境下的无人机作业场景。 核心应用场景 军事侦察与电子战 隐蔽部署&…...

视觉-语言-动作模型:概念、进展、应用与挑战(下)

25年5月来自 Cornell 大学、香港科大和希腊 U Peloponnese 的论文“Vision-Language-Action Models: Concepts, Progress, Applications and Challenges”。 视觉-语言-动作 (VLA) 模型标志着人工智能的变革性进步&#xff0c;旨在将感知、自然语言理解和具体动作统一在一个计…...