首页 > 其他分享 >将 Rust 代码编译为 WASM

将 Rust 代码编译为 WASM

时间:2024-08-14 11:18:28浏览次数:6  
标签:bindgen unknown JavaScript 编译 WASM wasm Rust

前言

在现代 Web 开发中,WebAssembly (WASM) 已成为一种强大的工具。它使得开发者可以在浏览器中运行高性能的代码,跨越传统的 JavaScript 性能限制。Rust 语言因其高效性和内存安全性,成为了编写 WASM 模块的热门选择。本文将介绍如何将 Rust 代码编译为 WebAssembly,并在 Web 项目中使用。

1. 创建 Rust 项目

首先,我们需要创建一个新的 Rust 项目。由于我们要生成一个可以被其它语言或工具调用的模块,因此选择创建一个库项目,而不是可执行程序。使用 cargo 命令可以轻松完成:

cargo new lib_wasm --lib

这个命令会生成一个名为 lib_wasm 的项目,其中包含一个基础的 Cargo.toml 配置文件和一个 src/lib.rs 文件,你将在其中编写你的 Rust 代码。

2. 添加 wasm-bindgen 依赖项

在 Rust 中,wasm-bindgen 是一个关键工具,它使 Rust 和 JavaScript 之间的交互变得更加简单。wasm-bindgen 负责生成与 JavaScript 交互所需的绑定代码,让你能够直接调用 Rust 编写的函数。

要添加 wasm-bindgen,你可以使用 cargo add 命令:

cargo add wasm-bindgen

或者,手动编辑 Cargo.toml 文件,添加如下依赖项:

[dependencies]
wasm-bindgen = "0.2"

添加 wasm-bindgen 后,Rust 编译器会在编译过程中生成必要的绑定文件,从而使你的 WASM 模块可以被 JavaScript 直接调用。

3. 安装 wasm32-unknown-unknown 目标

Rust 编译器默认会生成适用于本地机器架构的可执行文件。要编译成适用于 Web 的 WebAssembly 文件,我们需要添加一个特定的目标架构,即 wasm32-unknown-unknown。这是一个通用的 WASM 目标,不依赖任何特定的操作系统。

使用以下命令安装该目标:

rustup target add wasm32-unknown-unknown

此命令会配置你的 Rust 工具链,使其能够生成适用于 WebAssembly 的二进制文件。

4. 编写 Rust 代码

现在,你可以在 src/lib.rs 文件中编写你希望导出的功能。例如,我们可以编写一个简单的函数,它接受一个名字作为参数并返回一个问候语:

use wasm_bindgen::prelude::*;

// 使用 #[wasm_bindgen] 宏来导出函数到 JavaScript
#[wasm_bindgen]
pub fn greet(name: &str) -> String {
    format!("Hello, {}!", name)
}

在这段代码中,我们使用了 #[wasm_bindgen] 宏将 greet 函数导出,使其可以从 JavaScript 中调用。

5. 编译 Rust 项目为 WASM

编写完代码后,我们可以将其编译为 WASM 文件。编译时指定目标为 wasm32-unknown-unknown,并使用 --release 选项生成优化后的构建:

cargo build --target wasm32-unknown-unknown --release

编译完成后,生成的 .wasm 文件将存储在 target/wasm32-unknown-unknown/release/ 目录下。

6. 使用 wasm-bindgen 生成 JavaScript 绑定代码

虽然编译生成了 .wasm 文件,但直接在 JavaScript 中使用它并不方便。为此,我们需要使用 wasm-bindgen 工具生成相应的 JavaScript 绑定代码。这将创建一个便于在 JavaScript 中调用的模块。

首先,确保已安装 wasm-bindgen-cli 工具。你可以通过以下命令安装:

cargo install wasm-bindgen-cli

然后,运行以下命令生成 JavaScript 绑定文件:

wasm-bindgen --out-dir ./out --target web target/wasm32-unknown-unknown/release/lib_wasm.wasm

这会在 out 目录中生成一系列文件,包括 .js 文件和 .wasm 文件,你可以直接在 Web 项目中使用。

7. 在网页中使用 WASM 模块

现在,生成的 WASM 模块已经可以在 Web 项目中使用。你只需在 HTML 文件中导入生成的 JavaScript 绑定文件,并调用 Rust 导出的函数。例如:

<!DOCTYPE html>
<html>
<head>
    <title>Lib WASM Demo</title>
</head>
<body>
    <script type="module">
        import init, { greet } from "./out/lib_wasm.js";
        init().then(() => {
            console.log(greet("World"));
        });
    </script>
</body>
</html>

这个示例会在控制台打印出 "Hello, World!"。其中,init 函数用于初始化 WASM 模块,而 greet 函数则调用了我们在 Rust 中定义的函数。

8. 目录结构

经过以上步骤,你的项目目录结构可能如下:

index.html
out/
    ├── lib_wasm_bg.wasm
    ├── lib_wasm_bg.wasm.d.ts
    ├── lib_wasm.d.ts
    └── lib_wasm.js

out 目录中包含了生成的 WASM 文件以及相应的 JavaScript 绑定文件,index.html 是一个简单的网页,用于测试和展示你的 WASM 模块。

结语

通过这套流程,你可以轻松地将 Rust 代码编译为 WebAssembly,并将其集成到 Web 项目中。Rust 的高效性和 WebAssembly 的灵活性相结合,可以为 Web 应用带来显著的性能提升。

标签:bindgen,unknown,JavaScript,编译,WASM,wasm,Rust
From: https://www.cnblogs.com/guojikun/p/18358337

相关文章

  • Rust 之环境搭建
    前言Rust是一种现代的系统级编程语言,以其内存安全性、高性能和简洁的语法而著称。本文将介绍如何在不同操作系统上搭建Rust开发环境,并配置好基础工具,使您能够快速开始Rust编程。1.安装RustRust官方推荐使用rustup工具来管理Rust的安装和更新。rustup允许您轻松安......
  • 易语言之安装与编译
     使用的是免加密狗版本(否则无法编译打包)下载:  易语言官方5.9.3完整版+破解补丁.zip:https://share.feijipan.com/s/DdCBMdzb链接库:V6,v7,v8,v9,v2010  https://lanlang.lanzouq.com/iQHvk27e4uve  安装&破解:1)先安装5.9.3版本,安装完成之后,解压破解补丁......
  • 完美解决RTX5源码工程+最新emWin6.40的编译兼容问题,使能C编译器使用C11可解决
    最新的emWin6.40仅提供了.a格式库,这个库兼容MDK,IAR和GCC,但是在MDKAC6下使用需要做如下操作-fno-short-wchar-fshort-enums他这个操作,正好跟RTX5源码工程添加的一个设置冲突了,通过搜索资料,发现使能MDK使用C11版本编译可以完美解决这个问题:最终配置如下,确实解决了:最后就......
  • 智能合约语言对比:Solidity | Vyper | Move | Rust
    当你想要进入Web3领域做开发,可能会想知道应该先学哪门编程语言,或者是哪门语言最适合你。这里有四种现在比较热门的语言:Solidity、Vyper、Move和Rust。下面我会用代码示例解释一下区别,帮你找到学习的方向。Solidity:这是以太坊智能合约的主要编程语言。如果你想在以太坊上开发......
  • CMake-正规程序编译
    正规组织结构下编译正规组织结构指的是文件组织结构规范工整。一般情况下分为binbuildincludesrclib这些文件夹。例如在写使用线程进行tcp连接的demo中,组织架构如下:bin中存放可执行的二进制文件;build为编译文件夹;include存放所有的头文件;lib存放库文件,本文中没有使用;s......
  • Makefile 编译多级目录多个目标文件模板
    对于当前目录结构下的Makefile(基于图书管理系统).├──Makefile├──README.md├──bin│├──adminsys│└──usersys├──build│├──adminmain.o│├──generalcore.o│├──generalimpl.o│├──generalview.o│├──......
  • 【ZYNQ MPSoC开发】PL使用自定义IP后Vitis编译报错的解决方法
    问题发现:    在使用Alinx的AXU3EG开发板学习自定义IP时,发现PWM控制呼吸灯频率实验中,由于在PL端使用了自定义IP,Vitis编译PS端程序时会报错。问题所在:    这个问题并不是一个bug,而是官方希望使用者自行为自定义IP编写驱动和Makefile。虽然灵活性增加了,但同......
  • Java学习笔记3--java编译和运行的CMD命令
    windows下利用cmd命令行可以调用jdk里的javac.exe和java.exe对java文件进行编译和执行,前提是jdk已成功安装并正确配置相关环境变量执行命令解析:javac命令用于将java源文件编译为class字节码文件,如:javacHelloWorld.java。运行javac命令后,如果成功编译没有错误的话,会出现......
  • 【Rust光年纪】Rust数据结构库全方位解析:从核心功能到API概览
    提升Rust项目效率的利器:六款优秀数据结构库详解前言随着Rust编程语言的不断发展和普及,开发者们对于高效的数据结构库需求日益增长。在本文中,我们将介绍一些优秀的Rust数据结构库,它们分别为heapless、arrayvec、smallvec、evmap、hashbrown和generic-array。这些库提供了各......
  • centos7 编译 Qt5.11.3
    默认环境gcc4.8.520150623qt5.9.7kernel3.10.0GNUlibc2.17更换系统源,在2024年6月30后停止更新维护,默认源不可用mvCentOS-Base.repoCentOS-Base.repo.backupwget-OCentOS-Base.repohttp://mirrors.cloud.tencent.com/repo/centos7_base.repowget-Oepel.repo......