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

信创ARM架构QT应用开发环境搭建

Linux ARM架构QT应用开发环境搭建

    • 前言
    • 交叉工具链
      • Ubuntu上安装 32 位 ARM 交叉工具链
      • Ubuntu上安装 64 位 ARM 交叉工具链
    • 交叉编译 QT 库
      • 下载 QT 源码
      • 交叉编译 QT 源码
    • Qt Creator交叉编译配置
      • 配置 Qt Creator Kits
      • 创建一个测试项目
    • 小结

前言

有没有碰到过这种情况?开发出一款软件产品,交付给客户,客户说安装不上。经过一番调查,原因让人哭笑不得,你以兆芯为目标进行开发,客户电脑却用的是华为鲲鹏。这也不能怪客户,经过多年的市场培育,在大多数人的认知里,电脑就是 Windows 系统加上英特尔处理器。

这些年国产信创 Linux 系统开始推广,才有少数人开始有了操作系统的概念,原来除了 Windows 系统之外,还有其他奇奇怪怪的系统。

不光是操作系统, CPU 也是有好多种,并不是只有英特尔兼容的 CPU 才叫 CPU。由于 Intel CPU 的封闭性,越来越多的国内厂商瞄准了 ARM。ARM 芯片虽然主要使用在手机、嵌入式系统上,但经过厂商多年的努力,ARM 芯片的性能不断提升。特别是苹果公司宣布苹果电脑全线产品改用自家的 ARM 芯片,给了市场一剂强心剂。搭载苹果 M1、M2 等芯片的 Mac 系列电脑上市后,的确带来了惊喜。换芯后的 Mac 电脑不仅性能强大,功耗还相当低。

苹果公司把路都探好了,国内厂商没有理由不跟进,纷纷推出了针对桌面系统的 ARM 芯片,比如华为鲲鹏 990。目前,搭载华为鲲鹏 990 芯片的笔记本、台式机已经上市,操作系统一般搭载麒麟或统信 UOS 操作系统。

操作系统和 CPU 打头阵,应用程序得跟上才行。如果是使用 Java、Python 等解释性语言开发的应用,只要解释器或者虚拟机进行了移植,应用程序无需修改,可以直接在新的 CPU 架构上运行。但是对于 C/C++ 等编译语言开发的应用程序,则需要重新编译,有的甚至需要重新开发。

QT 作为一种广为流行的跨平台软件开发框架,在桌面应用开发中得到广泛应用。如何将为 X86 架构开发的 QT 应用,移植到 ARM 架构的系统上,是开发人员所要面临的新课题。

本文将介绍如何将 QT 应用程序移植到 ARM 架构的 Linux 系统上,方法同样适用于 ARM 版麒麟系统和 统信 UOS 系统。

交叉工具链

开发针对 ARM 架构的 QT 应用,有两种开发模式。

第一种就是以目标机作为开发环境,比如 ARM 版麒麟系统,在上面安装编译器、IDE 工具,编写代码,并最终编译、打包。不管是 ARM 版麒麟系统还是 ARM 版统信 UOS 系统,都有完整的 GCC 工具链,编译代码没有问题,但诸如 Qt Creator 之类的 IDE 工具就不见得有。另外 ARM 版的 Linux 系统,软件不够丰富,很多软件还没有提供 ARM 版本,碰到问题也不好解决。

所以,推荐采用第二种方式,即在英特尔 CPU 的Ubuntu 系统上开发、编译、打包,最后发布到 ARM 架构的系统上。这种方式就涉及到交叉编译。

所谓交叉编译(Cross-Compilation),是指在一种计算机系统上生成可在另一种不同体系结构或操作系统上运行的代码的过程。通常情况下,交叉编译涉及将源代码从一种平台(通常是开发者的本地平台)编译成目标平台上的可执行文件或库。这种技术在嵌入式系统、移动设备、服务器和其他各种计算机领域中都非常常见。

交叉编译的第一步就是需要交叉编译器(或叫交叉编译工具链),这是一种特殊的编译器,能够在一种平台上生成另一种平台的代码。

我们需要知道,ARM CPU 也是有 32 位和 64 位之分。早期的 ARM CPU,比如广泛使用的 ARMv7 指令集,就是 32 位。ARMv8-A 架构是 ARM 的第一个支持 64 位指令集的架构,它引入了 64 位的通用寄存器和指令集,同时也保留了对 32 位指令集的兼容性。

如果你希望你的应用程序具有更好的兼容性,可以选择针对 ARM 32 位处理器的交叉编译工具链。如果你希望更好的性能,只针对 64 位 ARM 处理器开发,那优选 ARM 32 位处理器的交叉编译工具链。

Ubuntu上安装 32 位 ARM 交叉工具链

在Ubuntu 上安装 ARM 交叉工具链,推荐直接使用 apt 包管理器。

首先,打开终端并更新软件包列表:

sudo apt update

然后安装 ARM 架构的交叉编译器工具链:

sudo apt install gcc-arm-linux-gnueabi

这将安装 GNU 工具链,其中包括了用于 ARM 架构的交叉编译器。

安装完毕后,你可以在终端中输入 arm-linux-gnueabi-gcc -v 命令验证:

$ arm-linux-gnueabi-gcc -v
Using built-in specs.
COLLECT_GCC=arm-linux-gnueabi-gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc-cross/arm-linux-gnueabi/9/lto-wrapper
Target: arm-linux-gnueabi
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 9.4.0-1ubuntu1~20.04.2' --with-bugurl=file:///usr/share/doc/gcc-9/README.Bugs --enable-languages=c,ada,c++,go,d,fortran,objc,obj-c++,gm2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-9 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-libitm --disable-libquadmath --disable-libquadmath-support --enable-plugin --with-system-zlib --without-target-system-zlib --enable-libpth-m2 --enable-multiarch --enable-multilib --disable-sjlj-exceptions --with-specs='%{mfloat-abi=hard:-march=armv7-a -mcpu=generic-armv7-a -mfloat-abi=hard}' --with-arch=armv5t --with-float=soft --disable-werror --enable-multilib --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=arm-linux-gnueabi --program-prefix=arm-linux-gnueabi- --includedir=/usr/arm-linux-gnueabi/include
Thread model: posix
gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.2)

某些 CPU 厂家可能提供了针对自家 CPU 优化的 GCC 交叉工具链,请参考提供的文档进行安装和配置。

Ubuntu上安装 64 位 ARM 交叉工具链

步骤和 32 位交叉工具链的安装类似。两种交叉工具链是可以同时安装的。ARM 64 位架构也被称为 AArch64。

  1. 打开终端并更新软件包列表:
sudo apt update
  1. 安装 ARM 64 位架构的交叉编译器工具链:
sudo apt install gcc-aarch64-linux-gnu
  1. 验证安装
$ aarch64-linux-gnu-gcc -v
Using built-in specs.
COLLECT_GCC=aarch64-linux-gnu-gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc-cross/aarch64-linux-gnu/9/lto-wrapper
Target: aarch64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 9.4.0-1ubuntu1~20.04.2' --with-bugurl=file:///usr/share/doc/gcc-9/README.Bugs --enable-languages=c,ada,c++,go,d,fortran,objc,obj-c++,gm2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-9 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-libquadmath --disable-libquadmath-support --enable-plugin --enable-default-pie --with-system-zlib --without-target-system-zlib --enable-libpth-m2 --enable-multiarch --enable-fix-cortex-a53-843419 --disable-werror --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=aarch64-linux-gnu --program-prefix=aarch64-linux-gnu- --includedir=/usr/aarch64-linux-gnu/include
Thread model: posix
gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.2) 

交叉编译 QT 库

QT 应用程序的开发离不开 QT 库。虽然麒麟系统和统信 UOS 系统都带有 QT 库(ARM 版带的是 ARM 架构的 QT 库),直接使用麒麟系统或统信 UOS 系统的 QT 库最简单。但有几种情况可能会需要你编译自己的 QT 库。

  1. 麒麟系统和统信 UOS 系统带的 QT 库版本不同,你希望应用程序能同时运行在多种系统上,而不是每个系统开发一个版本。
  2. 你已经为其它平台,如 Window、Mac OS 开发了 QT 应用程序,当时已经选择了 QT 的某个版本。为了代码跨平台,你希望选择同一版本的 QT。
  3. 你希望使用较新版本的 QT,而麒麟系统或统信 UOS 系统的 QT 库相对较老。

下载 QT 源码

QT 系统庞大而且复杂,除了 QT 框架,还有 QT Creator、QT Designer 之类的开发工具,所以要看准 QT 库,不要下错了。QT 库的链接:

https://download.qt.io/archive/qt/

选择你要使用的 QT 版本。在本专栏中,我都是使用 5.15.2 这个版本,这是一个 LTS(长期支持) 版本,也是最后一个支持 Windows 7 的版本。

先点击 5.15 这个链接,接下来点击 5.15.2 这个链接,再点击 single 链接,进入源码下载:
在这里插入图片描述
根据喜好选择 zip 包或者 tar 包,下载其中一个即可。

这里以 qt-everywhere-src-5.15.2.tar.xz 为例。

交叉编译 QT 源码

  1. 解压 QT 源码
tar xvf qt-everywhere-src-5.15.2.tar.xz

可以看到 qt-everywhere 源码中包含了几乎所有的 QT 模块。
在这里插入图片描述
2. 配置编译选项

配置编译选项有很多,可以使用如下的命令查看编译选项:

$ ./configure -h

因为选项很多,这里不一一解释,只说明一下我要修改的选项,其它的使用默认值。

-prefix <dir> 编译后的库文件安装路径前缀,一般是 /usr/local/Qt-$QT_VERSION,我不希望将 ARM版 QT 安装到系统目录,避免和 x86 版的 QT 混淆,所以指定别的路径。
-xplatform <target> 选择交叉工具链,这里使用 linux-arm-gnueabi-g++
-opensource 构建开源版 QT
-confirm-license 自动确认许可证
-no-opengl 禁用 OpenGL 支持
-skip <module> 如果某个模块不需要或编译不过,可以先不编译

最终的配置命令为:

./configure -prefix /work/mywork/qt-in-action/qt-arm -xplatform linux-arm-gnueabi-g++ -opensource -confirm-license -no-opengl -skip location
  1. 编译

根据你的 CPU 核数量决定并行编译的任务数,不确定的话不需要带 -j 参数:

make -j12

这个编译过程会比较长,先喝杯咖啡吧!

  1. 安装
make install

我之前指定的安装路径是 /work/mywork/qt-in-action/qt-arm,进入到这个目录,可以看到如下文件:
在这里插入图片描述
其中 include 为头文件,lib 为编译出来的 QT 库,开发 ARM 架构 QT 应用程序主要用到这两个目录下的文件。我们可以查看一下 Qt 库文件的信息:

$ file libQt5Core.so.5.15.2
libQt5Core.so.5.15.2: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, for GNU/Linux 3.17.0, BuildID[sha1]=17cb846340306bae3fca72a8e65189b775cc7f02, stripped

可以看出,确实是 ARM 架构的库文件。

Qt Creator交叉编译配置

开发 QT 应用程序,最推荐 Qt Creator。虽然有 VS Code 这样的万能开发工具,但 Qt Creator 速度快,集成源码编译、调试,使用起来更顺手。

Qt Creator 默认使用的是系统工具链,要支持开发 ARM 应用程序,还需要配置交叉工具链。

配置 Qt Creator Kits

打开 Qt Creator,然后点击菜单项 Tool | Option
在这里插入图片描述
点击左上的 Kits,然后点击 Qt Versions,接着点击 Add
在这里插入图片描述
在弹出的文件选择对话框中,选择上一步所编译出的 Qt qmake 文件(在 bin 目录下)。
在这里插入图片描述
接下来配置编译器。
在这里插入图片描述
主要是要设置编译器的路径,这里使用系统的交叉工具链,然后点击 Apply
在这里插入图片描述
再点击 Kits Tab,然后点击右边的 Add。
在这里插入图片描述
指定一个名称,C++ 编译器选择前面配置的 ARM-GCC,Qt Version 选择全面配置的 Qt 5.15.2(qt-arm),然后点击 OK,大功告成。
在这里插入图片描述

创建一个测试项目

Qt环境搭建好了,可以新建一个项目试试。

点击菜单项 File | New File or Project … ,打开新建工程向导。这里新建一个 Qt GUI 应用程序。
在这里插入图片描述
项目命名为 FirstArmApp,指定项目目录。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这一步 Kit Selection,要选择我们在上一步新建的 Kit ARM Qt 5.15.2。
在这里插入图片描述
在这里插入图片描述
项目建立起来后,可以右键点击项目,然后点击 Build
在这里插入图片描述
项目构建完毕后,我们可以在 build-FirstArmApp-ARM_Qt_5_15_2-Debug 目录看到我们编译出来的第一个 QT ARM 应用程序。

需要注意的是,这个编译出来的 QT 应用程序不能直接在 X86 的 Ubuntu 系统上运行,CPU 架构不同,我们可以查看文件信息。
在这里插入图片描述
把这个应用程序复制到 ARM 版的麒麟或 UOS 系统上,就可以运行。

小结

本文首先介绍了交叉编译的概念,接着介绍了在 Ubuntu Linux 系统上安装 ARM 交叉编译工具链,并使用 ARM 交叉编译工具链编译 QT 源码,得到了 ARM 版的 QT 库,最后介绍在 Qt Creator 中配置交叉工具链,并使用配置的交叉工具链编译出第一个 ARM 架构 QT 应用程序。

相关文章:

信创ARM架构QT应用开发环境搭建

Linux ARM架构QT应用开发环境搭建 前言交叉工具链Ubuntu上安装 32 位 ARM 交叉工具链Ubuntu上安装 64 位 ARM 交叉工具链 交叉编译 QT 库下载 QT 源码交叉编译 QT 源码 Qt Creator交叉编译配置配置 Qt Creator Kits创建一个测试项目 小结 前言 有没有碰到过这种情况&#xff1…...

使用SPM_batch进行批量跑脚本(matlab.m)

软件&#xff1a;spm8matlab2023bwin11 数据格式&#xff1a; F:\ASL\HC\CBF\HC_caishaoqing\CBF.nii F:\ASL\HC\CBF\HC_caishaoqing\T1.nii F:\ASL\HC\CBF\HC_wangdonga\CBF.nii F:\ASL\HC\CBF\HC_wangdonga\T1.nii clear spmdirD:\AnalysisApps\spm8; datadirF:\ASL\HC\CBF…...

力扣0124——二叉树的最大路径和

二叉树的最大路径和 难度&#xff1a;困难 题目描述 二叉树中的 路径 被定义为一条节点序列&#xff0c;序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点&#xff0c;且不一定经过根节点。 路径和 是路径中各节点…...

c# 字符串帮助类

public class StringHelper { #region 全角半角互相转换 /// <summary> /// 转全角的函数(SBC case) /// </summary> /// <param name"str">任意字符串</param> /// <returns>全…...

LabVIEW双光子荧光显微成像系统开发

双光子显微成像是一种高级荧光显微技术&#xff0c;广泛用于生物学和医学研究&#xff0c;尤其是用于活体组织的深层成像。在双光子成像过程中&#xff0c;振镜&#xff08;Galvo镜&#xff09;扮演了非常关键的角色&#xff0c;它负责精确控制激光束在样本上的扫描路径。以下是…...

Prim模板

通过代码探索Prim算法&#xff1a;最小生成树之旅 在计算机科学领域&#xff0c;图算法占据了至关重要的位置&#xff0c;尤其是在设计高效的网络&#xff08;无论是社交网络、计算机网络还是交通网&#xff09;时。在这些算法中&#xff0c;寻找最小生成树&#xff08;MST&am…...

CSS之盒子模型

盒子模型 01-选择器 结构伪类选择器 基本使用 作用&#xff1a;根据元素的结构关系查找元素。 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IE…...

Linux系统安装(CentOS Vmware)

学习环境安装 VMware安装 VMware下载&安装 访问官网&#xff1a;https://www.vmware.com 在此处可以选择语言 点击China&#xff08;简体中文&#xff09; 点击产品&#xff0c;点击Workstation Pro 下滑&#xff0c;点击下载试用版 下滑找到Workstation 17 Pro for Wi…...

STM32 硬件随机数发生器(RNG)

STM32 硬件随机数发生器 文章目录 STM32 硬件随机数发生器前言第1章 随机数发生器简介1.1 RNG主要特性1.2.RNG应用 第2章 RNG原理框图第3章 RNG相关寄存器3.1 RNG 控制寄存器 (RNG_CR)3.2 RNG 状态寄存器 (RNG_SR)3.3 RNG 数据寄存器 (RNG_DR) 第3章 RNG代码部分第4章 STM32F1 …...

Window环境下使用go编译grpc最新教程

网上的grpc教程都或多或少有些老或者有些问题&#xff0c;导致最后执行生成文件时会报很多错。这里给出个人实践出可执行的编译命令与碰到的报错与解决方法。&#xff08;ps:本文代码按照煎鱼的教程编写&#xff1a;4.2 gRPC Client and Server - 跟煎鱼学 Go (gitbook.io)&…...

STM32——FLASH(1)简单介绍、分类、读写流程及注意事项

文章目录 FLASH的特点Nor flash和nand flashflash的读写flash 的存储单位 flash的读写过程 FLASH的特点 可擦写数据可修改可重写访问速度<ROM Nor flash和nand flash Nor flash 1、与SDRAM相似&#xff0c;用户可以直接运行装载到NORFLASH里面的代码&#xff0c;减少SRAM…...

MySQL的DML语言

DML&#xff1a;Data Manipulation Language&#xff08;数据操作语言&#xff09; DML语言用来对数据库中表的数据记录进行增、删、改操作。 一、添加数据命令 注意&#xff1a; 插入数据时&#xff0c;指定的字段顺序需要与值的顺序是一一对应的。 字符串和日期型数据应该包…...

Vivado-IP核

Vivado-IP核 主程序 timescale 1ns / 1ps ////module ip_clk_wiz(input sys_clk,input sys_rst_n,output clk_out1,output clk_out2,output clk_out3,output clk_out4,output locked);clk_wiz_0 instance_name(// Clock out ports.clk_out1(clk_out1), // output clk_out…...

品牌如何营造生活感氛围?媒介盒子分享

「生活感」简而言之是指人们对生活的感受和意义&#xff0c;它往往没有充斥在各种重要的场合和事件中&#xff0c;而是更隐藏在细碎平凡的生活场景中。在营销越来越同质化的当下&#xff0c;品牌应该如何打破常规模式&#xff0c;洞察消费情绪&#xff0c;找到更能打动消费者心…...

Java 学习和实践笔记(2)

今天的学习进度&#xff1a; 注册并下载安装好了Java 8&#xff0c;之后进行以下配置。 1&#xff09;path 是一个常见的环境变量&#xff0c;它告诉系统除了在当前的目标下妹寻找此程序外&#xff0c;还可以到path指定的目录下找。这句话是什么意思呢&#xff1f;以下举报例…...

Python:批量url链接保存为PDF

我的数据是先把url链接获取到存入excel中&#xff0c;后续对excel做的处理&#xff0c;各位也可以直接在程序中做处理&#xff0c;下面就是针对excel中的链接做批量处理 excel内容格式如下&#xff08;涉及具体数据做了隐藏&#xff09; 标题文件链接文件日期网页标题1http://…...

【LeetCode每日一题】525连续数组 303区域和检索(前缀和的基本概念和3个简单案例)

前缀和 // 构造prefix let prefix [0] arr.forEach(num > {prefix.push(prefix.at(-1) num); })如果想要计算某个区间 i 到 j 这个子数组的和时&#xff0c;可以根据 prefix[j1] - prefix[i] 获得。 例题1&#xff1a;303.区域和检索 - 数组不可变 给定一个整数数组 num…...

形态学算法应用之连通分量提取的python实现——图像处理

原理 连通分量提取是图像处理和计算机视觉中的一项基本任务&#xff0c;旨在识别图像中所有连通区域&#xff0c;并将它们作为独立对象处理。在二值图像中&#xff0c;连通分量通常指的是所有连接在一起的前景像素集合。这里的“连接”可以根据四连通或八连通的邻接关系来定义…...

Kafka系列之:Kafka集群同时设置基于时间和日志大小两种方式保存Topic的数据

Kafka系列之:Kafka集群同时设置基于时间和日志大小两种方式保存Topic的数据 一、基于日志大小二、基于时间大小三、参数设置四、设置命令一、基于日志大小 "log.retention.bytes"是Apache Kafka中的一项配置参数,用于指定每个日志段文件的最大大小。当日志段文件的…...

pytest+allure批量执行测试用例

在 Pytest 中,可以使用装饰器 `@pytest.fixture` 来定义用例级别的前置和后置操作。下面是一个示例代码,演示了如何使用 Pytest 的前置和后置操作: ```python import pytest @pytest.fixture(scope="function") def setup_function(): print("Setup fu…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec&#xff1f; IPsec VPN 5.1 IPsec传输模式&#xff08;Transport Mode&#xff09; 5.2 IPsec隧道模式&#xff08;Tunne…...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看

文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...

深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏

一、引言 在深度学习中&#xff0c;我们训练出的神经网络往往非常庞大&#xff08;比如像 ResNet、YOLOv8、Vision Transformer&#xff09;&#xff0c;虽然精度很高&#xff0c;但“太重”了&#xff0c;运行起来很慢&#xff0c;占用内存大&#xff0c;不适合部署到手机、摄…...

热门Chrome扩展程序存在明文传输风险,用户隐私安全受威胁

赛门铁克威胁猎手团队最新报告披露&#xff0c;数款拥有数百万活跃用户的Chrome扩展程序正在通过未加密的HTTP连接静默泄露用户敏感数据&#xff0c;严重威胁用户隐私安全。 知名扩展程序存在明文传输风险 尽管宣称提供安全浏览、数据分析或便捷界面等功能&#xff0c;但SEMR…...

向量几何的二元性:叉乘模长与内积投影的深层联系

在数学与物理的空间世界中&#xff0c;向量运算构成了理解几何结构的基石。叉乘&#xff08;外积&#xff09;与点积&#xff08;内积&#xff09;作为向量代数的两大支柱&#xff0c;表面上呈现出截然不同的几何意义与代数形式&#xff0c;却在深层次上揭示了向量间相互作用的…...