Rust Wasm Linux开发环境搭建

news/2024/5/17 12:12:00/文章来源:https://blog.csdn.net/weixin_47560078/article/details/130559636

一、Linux 镜像版本

CentOS-7-x86_64-DVD-2009.iso,Virtual Box 7.0

选择 GNOME Desktop 版本,

配置远程连接(可选),

nmtui

激活连接 enp0s3 ,查看 ip 地址,

绑定端口转发, 

通过 ssh 连接,

ftp 连接,

# 也可以手动修改配置文件
# cd /etc/sysconfig/network-scripts/
# vim vi ifcfg-xxx# ONBOOT=yes 则会自动开启网络

二、安装Rust

# 官网 https://www.rust-lang.org/
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

 输入 1 默认安装就好。

修改 Rust 镜像源,

# $CARGO_HOME/.cargo/ 下创建 config.toml
$ touch config.toml# 添加以下内容[source.crates-io]
replace-with = 'ustc'[source.ustc]
registry = "git://mirrors.ustc.edu.cn/crates.io-index"

三、更换软件源

# 更换阿里源 https://developer.aliyun.com/mirror/centos?spm=a2c6h.13651102.0.0.3e221b11e44Xyj
# 备份
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
# 拉取源文件
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
# 生成缓存
yum makecache 

四、安装 WASMER

# 官网 https://wasmer.io/
# windows
iwr https://win.wasmer.io -useb | iex
# linux
curl https://get.wasmer.io -sSfL | sh -s "v3.3.0"
# 使用 cargo 安装
# cargo install wasmer-cli

遇到问题:version ·CLIBC_2.29· not found

解决方案:升级glibcwget http://ftp.gnu.org/gnu/glibc/glibc-2.31.tar.gztar -xf glibc-2.31.tar.gzcd glibc-2.31mkdir buildcd build../configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/binmake -j 8 --jobserver-style=pipemake installstrings /lib64/libc.so.6 | grep GLIBCmake localedata/install-localesldd --version

又遇到编译器版本过低问题,

只能先按照提示,把软件都安装升级一下;

在安装了 python3 、升级了 gmake 、gcc 之后,再执行安装,无报错,

# 参考以下连接
# GCC 升级 https://blog.csdn.net/carefree2005/article/details/117559312
# MAKE 升级 https://blog.csdn.net/fengqiangname/article/details/121655919
# GLIBCXX问题解决 https://blog.csdn.net/qq_22948593/article/details/110877000
# 缺少libstdc++.so.6 库 https://blog.csdn.net/qianjiu520/article/details/129417730
# Cannot open jobserver 解决 https://github.com/crosstool-ng/crosstool-ng/issues/1858

最终安装成功,

有时候GitHub连不上,多试几次就好了,wapm 可以不用安装, 

# 下载地址 https://github.com/wasmerio/wasmer/releases/download/v3.3.0/wasmer-linux-amd64.tar.gz

首次安装后,需要重开一个终端打开才生效,

wasmer

五、安装 Visual Studio Code

# 官网 https://code.visualstudio.com/sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc
sudo sh -c 'echo -e "[code]\nname=Visual Studio Code\nbaseurl=https://packages.microsoft.com/yumrepos/vscode\nenabled=1\ngpgcheck=1\ngpgkey=https://packages.microsoft.com/keys/microsoft.asc" > /etc/yum.repos.d/vscode.repo'yum check-updatesudo yum install code

六、安装 wasm 编译环境

# 新增 nightly 编译模式
rustup default nightly

# 新增编译目标
rustup target add wasm32-unknown-unknown
rustup target add wasm32-wasi

# 安装 wasm 绑定
cargo install wasm-pack
# cargo install https

七、安装 Node.js

# 下载
wget https://nodejs.org/dist/v18.16.0/node-v18.16.0-linux-x64.tar.gz# 解压
tar -zxvf node-v18.16.0-linux-x64.tar.gz# 新建安装目录
sudo mkdir /usr/local/nodejs# 移动到 /usr/local/nodejs
sudo mv node-v18.16.0-linux-x64/* /usr/local/nodejs# 建立软链接
sudo ln -s /usr/local/nodejs/bin/node /usr/local/bin/node
sudo ln -s /usr/local/nodejs/bin/npm /usr/local/bin/npm# 测试
node -v
npm -v# 安装 cnpm
npm install -g cnpm --registry=https://registry.npm.taobao.org
sudo ln -s /usr/local/nodejs/bin/cnpm /usr/local/bin/cnpm# 更换下载源
npm config set registry http://registry.npm.taobao.org

八、安装脚手架 cargo-generate

# 必须安装 openssl-devel
sudo yum install -y openssl-devel# cargo-generate 用于快速生成 WASM 项目的脚手架(类似 create-react-app)
cargo install cargo-generate

九、创建一个 WASM 项目 

# 使用模板生成
cargo generate --git https://github.com/rustwasm/wasm-pack-template# 打包
wasm-pack build --target web

可以看到在 pkg 下生成了 wasm 文件和胶水 js 代码。

十、创建一个 Vue 项目

# 使用 Vite
cnpm create vite@latest

将 pkg 文件夹复制到前端项目根路径下,

[sam@localhost wasm-web-demo]$ cp -r ../wasm-demo/pkg/* pkg

 页面引用 wasm 文件,

<script setup lang="ts">
import { onMounted, ref } from 'vue'import init, { greet } from '../../pkg/mydemo.js'defineProps<{ msg: string }>()const count = ref(0)onMounted(async () => {await init()greet()
})
# 开放端口
sudo iptables -I INPUT -p tcp --dport 5500 -j ACCEPT
sudo iptables -I INPUT -p tcp --dport 5173 -j ACCEPTiptables -L -n

十一、编译运行

npm run build
npm run dev

宿主主机访问,chrome,正常

Firefox,报错,低版本火狐浏览器不兼容正则表达式,

把  gs 改成 g 即可,

解决方案参考 https://blog.csdn.net/qq_33183172/article/details/127770780

或者选择升级火狐浏览器,

# 下载
waget https://download-ssl.firefox.com.cn/releases/firefox/113.0/zh-CN/Firefox-latest-x86_64.tar.bz2
# 解压
tar -xjvf Firefox-latest-x86_64.tar.bz2
# 删除系统默认旧版本的 Firefox
sudo rm -rf  /usr/lib64/firefox
# 将解压后的新版本 Firefox 移动到 /usr/lib64
sudo mv firefox /usr/lib64
# 创建一个新的软链接
cd /usr/bin
sudo rm firefox
sudo ln -s  /usr/lib64/firefox/firefox   /usr/bin/firefox

十二、Rust + WASI【运行在浏览器之外】

# 必须先添加 wasm32-wasi
rustup target add wasm32-wasi
# 使用 wasm 运行时 wasmer 
iwr https://win.wasmer.io -useb | iex
# 创建项目
cargo new wasi-demo
# 编译
cargo build --release --target wasm32-wasi 
# 运行
wamser run 

十三、通过 Wasmer 访问 OS 资源 

use std::fs;
use std::io::prelude::*;fn main() {let mut file = fs::File::create("/path/test.txt").unwrap();let mut array = String::new();array.push_str("你好,世界!");write!(file, "{}", array).unwrap();
}

运行时,因为wamser相当于一个容器,容器内的路径要绑定映射到宿主主机的路径,才能访问到宿主主机的资源,

wasmer run -h

# 编译
cargo build --release --target wasm32-wasi
# 运行
wasmer run --mapdir /path:. target/wasm32-wasi/release/wasi-demo.wasm

十四、编译成二进制可执行文件 

wasmer create-exe -o testexe target/wasm32-wasi/release/wasi-demo.wasm# wasmer 下载地址 https://github.com/wasmerio/wasmer/releases/download/v3.3.0/wasmer-linux-amd64.tar.gz

# 遇到一个错误 error: cannot get prefix for atom wasi-demo
# 在 issue 上找到解决方案 https://github.com/wasmerio/wasmer/issues/3834
# 解决方案:需要将命名中的 - 改成 _
mv target/wasm32-wasi/release/wasi-demo.wasm target/wasm32-wasi/release/wasi_demo.wasm# 如果遇到 fatal error: wasmer.h: No such file or directory ,则需要导入环境变量
# export WASMER_DIR=/home/user/.local/share/wasmer/# 如果还是报 fatal error: wasmer.h: No such file or directory ,就把安装目录下的 include 文件夹所有文件复制到 /usr/include

可以看到,编译为可执行文件成功,

 

执行 testexe 成功! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_488547.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JQuery 详细教程

文章目录 一、JQuery 对象1.1 安装和使用1.2 JQuery包装集对象 二、JQuery 选择器2.1 基础选择器2.2 层次选择器2.3 表单选择器 三、JQuery Dom 操作3.1 操作元素3.1.1 操作属性3.1.2 操作样式3.1.3 操作内容 3.2 添加元素3.3 删除元素3.4 遍历元素 四、JQuery 事件4.1 ready 加…

PBR核心理论与渲染原理

基于物理的渲染&#xff08;Physically Based Rendering&#xff0c;PBR&#xff09;是指使用基于物理原理和微平面理论建模的着色/光照模型&#xff0c;以及使用从现实中测量的表面参数来准确表示真实世界材质的渲染理念。 以下是对PBR基础理念的概括&#xff1a; 微平面理论…

Android View 事件分发机制,看这一篇就够了

在 Android 开发当中&#xff0c;View 的事件分发机制是一块很重要的知识。不仅在开发当中经常需要用到&#xff0c;面试的时候也经常被问到。 如果你在面试的时候&#xff0c;能把这块讲清楚&#xff0c;对于校招生或者实习生来说&#xff0c;算是一块不错的加分项。对于工作…

对STM32栈的理解Stack_Size EQU 0x00000400

对STM32栈的理解Stack_Size EQU 0x00000400 Stack_Size EQU 0x00000400表示什么意思可以通过查找flash内存的方式定位存储1.flash2.RAM内部 本人主要为个人参考网络及个人总结而来比较&#xff0c;如有雷同请告知&#xff0c;即刻删除 以下引用网上资料 理解堆和栈的区别 &…

PFCdocumentation_FISH Rules and Usage

目录 FISH Scripting FISH Rules and Usage Lines Data Types Reserved Names for Functions and Variables Scope of Variables Functions: Structure, Evaluation, and Calling Scheme Arithmetic: Expressions and Type Conversions Redefining FISH Functions Ex…

中断相关内容大全

中断基本概念&#xff1a;程序中断指计算机执行现行程序过程中&#xff0c;出现某种急需处理的异常情况或特殊请求&#xff0c;CPU暂时中止现行程序&#xff0c;而转去对这些异常情况或特殊请求进行处理&#xff0c;处理完毕后CPU又自动返回到现行程序的断点处&#xff0c;继续…

算法修炼之练气篇——练气十七层

博主&#xff1a;命运之光 专栏&#xff1a;算法修炼之练气篇 前言&#xff1a;每天练习五道题&#xff0c;炼气篇大概会练习200道题左右&#xff0c;题目有C语言网上的题&#xff0c;也有洛谷上面的题&#xff0c;题目简单适合新手入门。&#xff08;代码都是命运之光自己写的…

【最新可用】chatGPT镜像网站国内使用,免费稳定!

新建了一个网站 https://ai.weoknow.com/ 每天给大家更新可用的国内可用chatGPT 2023.5.8新增一个 ChatGPT 国内免翻版 【网站名称】&#xff1a;Chat GPT Ai 【使用环境】&#xff1a;移动端/电脑网页端 ChatGPT是一款功能强大的免费在线聊天机器人&#xff0c;具有人工智能…

JavaScript通过js的方式来计算平行四边形的面积的代码

以下为通过js的方式来计算平行四边形的程序代码和运行截图 目录 前言 一、通过js的方式来计算平行四边形&#xff08;html部分&#xff09; 1.1 运行流程及思想 1.2 代码段 二、通过js的方式来计算平行四边形&#xff08;js部分&#xff09; 2.1 运行流程及思想 2.2 代码…

C#中如何使用ObjectPool来提高StringBuilder的性能

在C#中我们知道使用StringBuilder能提高大量字符串拼接的效率&#xff0c;其实StringBuilder的效率也可以提升&#xff0c;那就是使用ObjectPool。以下介绍怎么使用ObjectPool提高StringBuilder的性能。一、简介 C# ObjectPool类是一个内置的类库&#xff0c;用于实现对象…

AFG1062任意波形/函数发生器 产品资料

AFG1000 任意波形/函数发生器&#xff0c;提供 25MHz 或 60MHz 带宽&#xff0c;2 个输出通道&#xff0c;在整个带宽内 1mVpp 到 10Vpp 输出振幅&#xff0c;泰克 AFG1000 任意波形/函数发生器可以生成各种实验室测试所需波形。 *重要的是&#xff0c;它在泰克任意函数发生器系…

基于知识图谱的个性化学习资源推荐系统的设计与实现(论文+源码)_kaic

摘 要 最近几年来&#xff0c;伴随着教育信息化、个性化教育和K12之类的新观念提出,一如既往的教育方法向信息化智能化的转变&#xff0c;学生群体都对这种不受时间和地点约束的学习方式有浓厚的兴趣。而现在市面上存在的推荐系统给学生推荐资料时不符合学生个人对知识获取的…

小曾同学【五周年创作纪念日】——努力向前冲的菜鸟

&#x1f604;作者简介&#xff1a; 小曾同学.com,一个致力于测试开发的博主⛽️&#xff0c; 如果文章知识点有错误的地方&#xff0c;还请大家指正&#xff0c;让我们一起学习&#xff0c;一起进步。&#x1f60a; 座右铭&#xff1a;不想当开发的测试&#xff0c;不是一个好…

自主可控不走捷径,中国长城做难且正确的事

2020-2022年是中国信创产业的重要推广期&#xff0c;在国家战略的支持下&#xff0c;自主可控领域诸多相关企业均获得绝佳发展良机。 但信创产业“完成替代”不是终点&#xff0c;“实现领先”方是目标。如今势已启、路尚远&#xff0c;前景广阔的市场并不意味着自主可控相关企…

Hadoop之block切片

切片是一个逻辑概念 在不改变现在数据存储的情况下&#xff0c;可以控制参与计算的节点数目 通过切片大小可以达到控制计算节点数量的目的 有多少个切片就会执行多少个Map任务 hdfs上数据存储的一个单元,同一个文件中块的大小都是相同的 因为数据存储到HDFS上不可变&#xff0…

Lucene(1):Lucene介绍

Lucene官网&#xff1a; http://lucene.apache.org/ 1 搜索技术理论基础 1.1 lucene优势 原来的方式实现搜索功能&#xff0c;我们的搜索流程如下图&#xff1a; 上图就是原始搜索引擎技术&#xff0c;如果用户比较少而且数据库的数据量比较小&#xff0c;那么这种方式实现搜…

2路 QSFP,40G 光纤的数据实时采集(5GByte/s 带宽)板卡设计原理图 -PCIE732

板卡概述 PCIE732 是一款基于 PCIE 总线架构的高性能数据传输卡&#xff0c;板卡具有 1 个 PCIex8 主机接口、2 个 QSFP40G 光纤接口&#xff0c;可以实现 2 路 QSFP 40G 光纤的数据实时采集、传输。板卡采用 Xilinx 的高性 能 Kintex UltraScale 系列 FPGA 作为实时处理器…

小程序开发中的插件、组件、控件到底有什么区别?

小程序插件代码由一些自定义组件和 JS 代码文件构成&#xff0c;插件开发者在发布插件时&#xff0c;这些代码被上传到后台保存起来。当小程序使用插件时&#xff0c;使用者需填写插件的 AppID 和版本号&#xff0c;就可从后台获取相应的插件代码。小程序代码编译时&#xff0c…

2023什么蓝牙耳机好?经销商盘点新手必入蓝牙耳机品牌

蓝牙耳机是除手机外我们使用频率最高的数码产品&#xff0c;我做蓝牙耳机经销商五年来&#xff0c;对各个品牌都有深入了解。近期看到很多新手们咨询什么蓝牙耳机好&#xff0c;我给大家盘点一下新手必看的五大蓝牙耳机品牌。 1.JEET Air 2蓝牙耳机 推荐理由&#xff1a;专为舒…

知识点回顾(一)

1.final,finally ,finalize final?修饰符&#xff08;关键字&#xff09;如果一个类被声明为final&#xff0c;意味着它不能再派生出新的子类&#xff0c;不能作为父类被继承。因此一个类不能既被声明为 abstract的&#xff0c;又被声明为final的。将变量或方法声明为final&…