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

使用fpm工具制作Vim.rpm包

        背景:生产环境中的CentOS 7在安全扫描中被扫描出vim存在堆缓冲区溢出(CVE-2024-45306)等漏洞。根据漏洞说明,需要升级到最新版。 奈何CentOS 7已经停止维护了,所以,想在网上找一个最新版的vim.rpm相当不容易。无奈之下,只有自己制作一个rpm包了。

        基于之前使用rpmbuild打包的经验,首先到vim官网下载源码包,解压之后,发现源码包里面没有现成的spec文件。如果用rpmbuild来制作rpm包,则需要自己写spec文件。由于我对spec不熟悉,又不想学习,所以,继续搜索是否有其他办法,于是就找到了fpm这个工具。fpm也是一个开源的,地址在这里,发现源码的提交记录已经有13年之久了,好家伙,为什么我现在才知道,😂😂😂。好了,下面正式开始介绍fpm。

1.fpm工具简介

        fpm的官网点这里。以下是官网的截图:

简单翻译一下: 

fpm 是一个工具,可以让您轻松创建 Debian、Ubuntu、Fedora、CentOS、RHEL、Arch Linux、FreeBSD、macOS 等系统的包。

fpm 并不是一个新的打包系统,而是一个帮助您为现有系统创建包的工具,目的是减少您的工作量。它通过提供命令行接口,使您可以更轻松地创建包。以下是一些使用 fpm 的示例:

  • fpm -s npm -t deb express – 为 Node.js 的 Express 库制作 Debian 包。
  • fpm -s cpan -t rpm Fennec – 为 Perl Fennec 模块制作 RPM 包。
  • fpm -s dir -t pacman -n fancy ~/.zshrc – 将您的 ~/.zshrc 文件打包成 Arch Linux 的 pacman 包,名为“fancy”。
  • fpm -s python -t freebsd Django – 创建一个包含 Python Django 库的 FreeBSD 包。
  • fpm -s rpm -t deb mysql.rpm – 将 RPM 包转换为 Debian 包。

从上面的介绍来看,fpm的功能还是很强大的,支持各个平台。 

2.安装fpm

        由于fpm是用ruby写的,因此,需要先安装ruby的环境。检查ruby:

[root@localhost /]# ruby
-bash: ruby: command not found
[root@localhost /]# rpm -qa|grep ruby
[root@localhost /]#

安装ruby:

[root@localhost /]# yum install -y ruby
Total download size: 3.8 M
Installed size: 13 M
Downloading packages:
(1/10): libyaml-0.1.4-11.el7_0.x86_64.rpm                                                                                                                         |  55 kB  00:00:02
(2/10): ruby-2.0.0.648-39.el7_9.x86_64.rpm                                                                                                                        |  73 kB  00:00:02
(3/10): ruby-irb-2.0.0.648-39.el7_9.noarch.rpm                                                                                                                    |  94 kB  00:00:02
(4/10): rubygem-bigdecimal-1.2.0-39.el7_9.x86_64.rpm                                                                                                              |  85 kB  00:00:01
(5/10): rubygem-io-console-0.4.2-39.el7_9.x86_64.rpm                                                                                                              |  56 kB  00:00:01
(6/10): rubygem-json-1.7.7-39.el7_9.x86_64.rpm                                                                                                                    |  82 kB  00:00:01
(7/10): rubygem-psych-2.0.0-39.el7_9.x86_64.rpm                                                                                                                   |  84 kB  00:00:01
(8/10): rubygem-rdoc-4.0.0-39.el7_9.noarch.rpm                                                                                                                    | 324 kB  00:00:02
(9/10): rubygems-2.0.14.1-39.el7_9.noarch.rpm                                                                                                                     | 215 kB  00:00:01
(10/10): ruby-libs-2.0.0.648-39.el7_9.x86_64.rpm   

ruby安装好之后,gem也自动安装好了,gem是什么东西呢?

GemRuby 编程语言中的包管理格式和工具。它用于分发、安装和管理 Ruby 库和程序。Gem 文件本质上是一个压缩包,包含了一个 Ruby 程序或库的代码、相关文档、依赖项等信息。我理解这个应该跟node&npm的关系是一个道理吧。

安装fpm:

[root@localhost /]# gem install fpm
ERROR:  Could not find a valid gem 'fpm' (>= 0), here is why:Unable to download data from https://rubygems.org/ - no such name (https://rubygems.org/latest_specs.4.8.gz)
[root@localhost /]#

遇到上面的情况,可能是你的机器访问不了那个地址,网络的问题, 需要设置代理等。

[root@localhost /]# gem install fpm
Fetching: cabin-0.9.0.gem (100%)
Successfully installed cabin-0.9.0
Fetching: backports-3.25.0.gem (100%)
Successfully installed backports-3.25.0
Fetching: arr-pm-0.0.12.gem (100%)
Successfully installed arr-pm-0.0.12
Fetching: clamp-1.0.1.gem (100%)
Successfully installed clamp-1.0.1
Fetching: stud-0.0.23.gem (100%)
Successfully installed stud-0.0.23
Fetching: mustache-0.99.8.gem (100%)
Successfully installed mustache-0.99.8
Fetching: insist-1.0.0.gem (100%)
Successfully installed insist-1.0.0
Fetching: dotenv-3.1.4.gem (100%)
ERROR:  Error installing fpm:dotenv requires Ruby version >= 3.0.
[root@localhost /]#

如果遇到 dotenv requires Ruby version >= 3.0. 则需要把ruby版本升级到3.0以上。

查看当前ruby版本:

[root@localhost /]# ruby -v
ruby 2.0.0p648 (2015-12-16) [x86_64-linux]

 确实ruby版本低于3.0,那就升级ruby吧,这里又要用到另外一个工具:RVM(Ruby Version Manager),这个工具又类似node的版本管理工具nvm。

下载rvm:

# 安装 RVM(如果尚未安装)
\curl -sSL https://get.rvm.io | bash -s stable

下载rvm时,如果报这个错:

[root@localhost /]# \curl -sSL https://get.rvm.io | bash -s stable
Downloading https://github.com/rvm/rvm/archive/1.29.12.tar.gz
Downloading https://github.com/rvm/rvm/releases/download/1.29.12/1.29.12.tar.gz.asc
gpg: directory `/root/.gnupg' created
gpg: new configuration file `/root/.gnupg/gpg.conf' created
gpg: WARNING: options in `/root/.gnupg/gpg.conf' are not yet active during this run
gpg: keyring `/root/.gnupg/pubring.gpg' created
gpg: Signature made Sat 16 Jan 2021 02:46:22 AM CST using RSA key ID 39499BDB
gpg: Can't check signature: No public key
GPG signature verification failed for '/usr/local/rvm/archives/rvm-1.29.12.tgz' - 'https://github.com/rvm/rvm/releases/download/1.29.12/1.29.12.tar.gz.asc'! Try to install GPG v2 and then fetch the public key:gpg2 --keyserver hkp://keyserver.ubuntu.com --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDBor if it fails:command curl -sSL https://rvm.io/mpapis.asc | gpg2 --import -command curl -sSL https://rvm.io/pkuczynski.asc | gpg2 --import -In case of further problems with validation please refer to https://rvm.io/rvm/security[root@localhost /]#

则根据他的提示,执行:

gpg2 --keyserver hkp://keyserver.ubuntu.com --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB

 然后重新执行下载:

\curl -sSL https://get.rvm.io | bash -s stable

查看rvm安装路径:

[root@localhost /]# whereis rvm
rvm: /usr/local/rvm

刷新一下环境变量,否则执行rvm会提示找不到命令,或者新开一个终端也可以。

[root@localhost bin]# rvm
-bash: rvm: command not found
[root@localhost bin]# source /etc/profile
[root@localhost bin]# rvm
Ruby enVironment Manager 1.29.12 (latest) (c) 2009-2020 Michal Papis, Piotr Kuczynski, Wayne E. SeguinUsage:rvm [--debug][--trace][--nice] <command> <options>

安装ruby 3.0:

[root@localhost bin]# rvm install 3.0

安装成功之后,切换ruby的版本:

# 使用 Ruby 3.0
[root@localhost /]# rvm use 3.0 --default
Using /usr/local/rvm/gems/ruby-3.0.0
[root@localhost /]#
[root@localhost /]# ruby -v
ruby 3.0.0p0 (2020-12-25 revision 95aff21468) [x86_64-linux]
[root@localhost /]#

从上面的输出可以看到,版本已经切换到3.0了。

再次安装fpm:

[root@localhost /]# gem install fpm
Done installing documentation for stud, mustache, insist, dotenv, clamp, cabin, pleaserun, backports, arr-pm, fpm after 4 seconds
10 gems installed
[root@localhost /]#

上面的日志表示安装成功,查看 版本信息:

[root@localhost /]# fpm --version
1.15.1

至此,fpm 已经安装好了。

3.制作vim.rpm

        由于fpm本身并不编译源码,所以需要我们自己先把源码编译过程执行完了之后,再使用fpm来打包。

        准备好源码包,并解压到指定目录,比如放在root这个目录下:

[root@localhost ~]# tar -xvf vim-9.1.0787.tar.gz

执行configure命令:

[root@localhost vim-9.1.0787]# ./configure --prefix=/usr/local
  • 这个命令用于配置源代码包,以便生成适合于当前系统的构建文件。
  • --prefix=/usr/local 参数指定了安装路径,表示将软件安装到 /usr/local 目录下。这样,软件的可执行文件、库文件和其他相关文件将会被放在 /usr/local/bin/usr/local/lib 等相应的目录中。

如果报这个错误:

[root@localhost vim-9.1.0787]# ./configure --prefix=/usr/local
/bin/sh: error while loading shared libraries: libtinfo.so.5: cannot open shared object file: No such file or directory
[root@localhost vim-9.1.0787]#

 那么需要安装ncurses和ncurses-devel:

[root@localhost vim-9.1.0787]# yum install -y ncurses ncurses-devel

然后重新执行configure:

[root@localhost vim-9.1.0787]# ./configure --prefix=/usr/local

 执行make命令:

[root@localhost vim-9.1.0787]# make

执行make install命令:

[root@localhost vim-9.1.0787]# make install DESTDIR=~/rpm-build/vim-9.1.0787/
  • 这个命令用于将编译好的文件安装到指定目录。
  • DESTDIR=~/rpm-build/vim-9.1.0787/ 参数指定了安装的目标目录。在这个例子中,所有安装的文件会被放入 ~/rpm-build/vim-9.1.0787/ 目录,而不是系统的默认位置(如 /usr/local)。这通常用于打包目的,方便后续将这些文件打包成 RPM 或其他格式。

上述命令已经将我们需要的文件准备好了,首先进入~/rpm-build/vim-9.1.0787/目录,然后开始执行fpm的打包命令 :

[root@localhost vim-9.1.0787]# cd ~/rpm-build/vim-9.1.0787/
[root@localhost 
[root@localhost vim-9.1.0787]# fpm -s dir -t rpm -n vim -v 9.1.0787 . #最后一个.表示当前目录
Need executable 'rpmbuild' to convert dir to rpm {:level=>:error}
[root@localhost vim-9.1.0787]#

上面提示还需要安装rpmbuild,这么说来,虽然fpm不用写rpmbuild了,但是执行过程中还是调用的rpmbuild来打包的。

 安装rpmbuild:

[root@localhost vim-9.1.0787]# yum install -y rpmdevtools rpmlint

然后重新执行打包命令:

[root@localhost vim-9.1.0787]# fpm -s dir -t rpm -n vim -v 9.1.0787 .
Created package {:path=>"vim-9.1.0787-1.x86_64.rpm"}

看吧,安装包打好了。 

[root@localhost vim-9.1.0787]# ll
total 13844
drwxr-xr-x 3 root root       19 Oct 18 20:58 usr
-rw-r--r-- 1 root root 14176233 Oct 18 21:09 vim-9.1.0787-1.x86_64.rpm
[root@localhost vim-9.1.0787]#

使用rpm -qpl命令可以查看打包的文件是否正确:

[root@localhost vim-9.1.0787]# rpm -qpl vim-9.1.0787-1.x86_64.rpm
/usr/local/bin/ex
/usr/local/bin/rview
/usr/local/bin/rvim
/usr/local/bin/view
/usr/local/bin/vim
/usr/local/bin/vimdiff
/usr/local/bin/vimtutor
/usr/local/bin/xxd

现在可以拿这个rpm去测试了,不过,这里有个问题 ,我们在执行configure的时候提示需要ncurses,但这个rpm安装的时候,没有任何提示,这就容易导致安装包安装成功了,却无法使用的问题。因此,我们打包时,还需要将依赖项写进打包命令里面,像这样:

[root@localhost vim-9.1.0787]# fpm -s dir -t rpm -n vim -v 9.1.0787 -d "ncurses" .
Created package {:path=>"vim-9.1.0787-1.x86_64.rpm"}

可以执行下面的命令,查看依赖关系:

[root@localhost /]# rpm -qpR vim-9.1.0787-1.x86_64.rpm
ncurses

至此,整个打包环节就完成了。虽然使用fpm也有缺点,但还算比较方便 ,值得推荐。

 

 

 

 

 

 

相关文章:

使用fpm工具制作Vim.rpm包

背景&#xff1a;生产环境中的CentOS 7在安全扫描中被扫描出vim存在堆缓冲区溢出&#xff08;CVE-2024-45306&#xff09;等漏洞。根据漏洞说明&#xff0c;需要升级到最新版。 奈何CentOS 7已经停止维护了&#xff0c;所以&#xff0c;想在网上找一个最新版的vim.rpm相当不容易…...

Dorado7 全局缓存当前登录人信息 localStorage

登录成功时赋值 com.gs.mcf.view/index.js // like12 add,20240906,全局缓存当前登录人信息var currentName view.get(#userNameLb).get(tip);if(window.localStorage){localStorage.setItem("currentName", currentName);} 使用 // like12 add,20240906,全局缓存…...

【2024最新版】网络安全学习路线-适合入门小白

首先说明&#xff0c;我是一名CTF的web手&#xff0c;这是我自己亲身学习网络安全的路线&#xff0c;希望能够帮到大家&#xff0c;我虽然不是大牛&#xff0c;但我也希望能够帮助一些网安小白找到自己学习的方向&#xff0c;后面有就业的详细安全技术要求&#xff0c;如果真想…...

高可用之限流-07-token bucket 令牌桶算法

限流系列 开源组件 rate-limit: 限流 高可用之限流-01-入门介绍 高可用之限流-02-如何设计限流框架 高可用之限流-03-Semaphore 信号量做限流 高可用之限流-04-fixed window 固定窗口 高可用之限流-05-slide window 滑动窗口 高可用之限流-06-slide window 滑动窗口 sen…...

软件测试学习笔记丨Pycharm运行与调试

本文转自测试人社区&#xff0c;原文链接&#xff1a;https://ceshiren.com/t/topic/23454 Pycharm作为集成开发环境&#xff0c;除了可以编写脚本&#xff0c;还可以运行和调试自己的代码&#xff0c;下面就为大家介绍一下pycharm运行和调试代码的功能如何使用。 代码运行 编…...

flask基础学习

一、Python之flask、Django、Tornado框架 一&#xff09;django 主要是用来搞快速开发的&#xff0c;他的亮点就是快速开发&#xff0c;节约成本。 正常的并发量不过10000&#xff0c;如果要实现高并发的话&#xff0c;就要对django进行二次开发&#xff0c;比如把整个笨重的框…...

【SSM详细教程】-04-Spring基于注解的组件扫描

精品专题&#xff1a; 01.《C语言从不挂科到高绩点》课程详细笔记 https://blog.csdn.net/yueyehuguang/category_12753294.html?spm1001.2014.3001.5482https://blog.csdn.net/yueyehuguang/category_12753294.html?spm1001.2014.3001.5482 02. 《SpringBoot详细教程》课…...

Keepalived:构建高可用性的秘密武器

Keepalived&#xff1a;构建高可用性的秘密武器 在现代的IT环境中&#xff0c;高可用性是确保业务连续性和用户体验的关键要素。一旦系统出现故障或停机&#xff0c;企业可能会面临巨大的经济损失和声誉损害。因此&#xff0c;实施高可用性解决方案至关重要。Keepalived作为一…...

【C++刷题】力扣-#228-汇总区间

题目描述 给定一个整数数组 nums&#xff0c;返回所有唯一的区间&#xff0c;这些区间包含数组中的每个数字&#xff0c;形式为 [a, b]&#xff0c;其中 a 和 b 是数字的最小和最大值。 示例 示例 1: 输入: nums [0,1,2,4,5,7] 输出: [["0,2"],["4,5"],…...

交通银行核心系统分布式实践

1、背景:客户需求和痛点 交通银行已有核心ECIF、贷记卡核心、借记卡新核心等数百套系统上线OceanBase分布式数据库。其中,贷记卡(俗称信用卡)属于 A类核心业务系统,支撑了信用卡授权、用卡、额度、账务等核心业务功能,约7千万卡量,日交易量和数据量都在千万级别。 交通银行…...

深入剖析:.Net8 引入非root用户运行的新特性提升应用安全性

在云原生的时代&#xff0c;容器化技术如Docker和Kubernetes已经成为现代软件开发的重要基石。随着.Net8的发布&#xff0c;微软进一步优化了这些环境的支持&#xff0c;特别是在提升容器应用安全性方面迈出了重要一步。本文将深入探讨.Net8中非根用户功能的新增特性&#xff0…...

多签机制简明理解及实例说明

目录 Multisignature机制简明理解及实例说明 Multisignature机制中的公钥、私钥、Nonce及签名验签详解 加密货币托管账户的多重签名机制 Multisignature机制简明理解及实例说明 一、基本概念 Multisignature(多重签名)机制是一种先进的加密技术,它允许一笔交易必须由多…...

PCL 点云配准 LM-ICP算法(精配准)

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1 法线计算函数 2.1.2 执行 LM-ICP 函数 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接&#xff1a; PCL点云算法与项目实战案例汇总&#xff08;长期更新&a…...

Mac 编译 Unreal 源码版本

在Mac上编译Unreal Engine源码需要遵循以下步骤&#xff1a; 安装必要的依赖项&#xff1a; Xcode Python&#xff08;建议使用2.7版本&#xff09; Java&#xff08;使用JDK 8&#xff09; CMake Ninja SVN&#xff08;用于获取某些依赖项&#xff09; 获取Unreal Engi…...

开源vGPU方案 HAMi实现细粒度GPU切分——筑梦之路

前言 为什么需要 GPU 共享、切分等方案&#xff1f; 在使用GPU的过程中我们会发现&#xff0c;直接在裸机环境使用&#xff0c;都可以多个进程共享 GPU&#xff0c;怎么到 k8s 环境就不行了&#xff1f; 1. 资源感知 在 k8s 中资源是和节点绑定的&#xff0c;对于 GPU 资源…...

性能测试工具JMeter

本次使用的博客系统的url&#xff1a; http://8.137.19.140:9090/blog_edit.html 1. JMeter介绍 环境要求&#xff1a;要求java&#xff0c;jdk版本大于8&#xff1b; Apache JMeter 是 Apache 组织基于 Java 开发的压⼒测试⼯具&#xff0c;⽤于对软件做性能测试&#xff1b…...

Kubernetes ETCD的恢复与备份

在 Kubernetes 中&#xff0c;ETCD 扮演着至关重要的角色&#xff1a; 1. 集群状态存储 2. 服务发现 3. 配置管理 4. 分布式锁和协调 5. 故障恢复 ETCD 存储了 Kubernetes 集群中所有的状态信息&#xff0c;包括节点、Pod、Service、ConfigMap、Secrets 等。ETCD 支持服务发现…...

笔记整理—linux网络部分(2)Linux网络框架

前文说过&#xff0c;在OSI中将网络分为7层&#xff0c;这是理论上将其分为7层&#xff0c;但实际上可以将其分为4层。如TCP协议就是将其分为4层。理论只是提出一种指导意见&#xff0c;但不是行业范本。 驱动层只关系有没有接到包&#xff0c;不关心包经过多少次转发&#xff…...

深度学习500问——Chapter17:模型压缩及移动端部署(5)

文章目录 17.9.5 ShuffleNet- v1 17.9.6 ShuffleNet- v2 17.10 现有移动端开源框架及其特点 17.10.1 NCNN 17.10.2 QNNPACK 17.9.5 ShuffleNet- v1 ShuffleNet 是Face团队提出的&#xff0c;晚于MobileNet两个月在arXiv上公开《ShuffleNet&#xff1a; An Extremely Efficient…...

分布式ID多种生成方式

分布式ID 雪花算法&#xff08;时间戳41机器编号10自增序列号10&#xff09; 作用&#xff1a;希望ID按照时间进行有序生成 原理&#xff1a; 即一台带有编号的服务器在毫秒级时间戳内生成带有自增序号的ID,这个ID保证了自增性和唯一性 雪花算法根据结构的生成ID个数的上线时…...

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

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

LeetCode - 394. 字符串解码

题目 394. 字符串解码 - 力扣&#xff08;LeetCode&#xff09; 思路 使用两个栈&#xff1a;一个存储重复次数&#xff0c;一个存储字符串 遍历输入字符串&#xff1a; 数字处理&#xff1a;遇到数字时&#xff0c;累积计算重复次数左括号处理&#xff1a;保存当前状态&a…...

MVC 数据库

MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

免费PDF转图片工具

免费PDF转图片工具 一款简单易用的PDF转图片工具&#xff0c;可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件&#xff0c;也不需要在线上传文件&#xff0c;保护您的隐私。 工具截图 主要特点 &#x1f680; 快速转换&#xff1a;本地转换&#xff0c;无需等待上…...

NPOI操作EXCEL文件 ——CAD C# 二次开发

缺点:dll.版本容易加载错误。CAD加载插件时&#xff0c;没有加载所有类库。插件运行过程中用到某个类库&#xff0c;会从CAD的安装目录找&#xff0c;找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库&#xff0c;就用插件程序加载进…...

比较数据迁移后MySQL数据库和OceanBase数据仓库中的表

设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧

上周三&#xff0c;HubSpot宣布已构建与ChatGPT的深度集成&#xff0c;这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋&#xff0c;但同时也存在一些关于数据安全的担忧。 许多网络声音声称&#xff0c;这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...

【Veristand】Veristand环境安装教程-Linux RT / Windows

首先声明&#xff0c;此教程是针对Simulink编译模型并导入Veristand中编写的&#xff0c;同时需要注意的是老用户编译可能用的是Veristand Model Framework&#xff0c;那个是历史版本&#xff0c;且NI不会再维护&#xff0c;新版本编译支持为VeriStand Model Generation Suppo…...