0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用C++编写通用库并在 Rust 中使用它 (WASI)

jf_wN0SrCdH 来源:Rust语言中文社区 2023-06-16 10:03 次阅读

使用 C++ 编写通用库并在 Rust 中使用它 (WASI)

WebAssembly 简介

WebAssembly 是一种二进制指令格式,旨在成为一种低级虚拟机,可以在 Web 浏览器中以接近本机的速度运行代码。它不特定于网络,也可以在其他平台上运行。WebAssembly 代码可以从各种编程语言编译而来,例如 C、C++、Rust、C# 等。 Wasmer 是一个轻量级且快速的 WebAssembly 运行时,可以在各种平台上运行 WebAssembly 模块,包括 Windows、Linux 和 macOS。Wasmer 支持多种编程语言,包括 C、C++、Rust 等。

使用 C++ 创建 WebAssembly 库

首先,我们将使用 C++ 创建一个简单的“加法”函数,它将两个整数作为输入并返回它们的和。


// add.cpp extern "C" { int add ( int a, int b) { return a + b; } }

在这段代码中,我们将使用 Rust 中的 add 函数。使用外部“C”是为了使函数“add”不被编译器破坏。我们将不得不在我们的 Rust 代码中使用相同的名称。以下是将代码编译为 WebAssembly 的更新命令:


wasmc++ add.cpp -o add.wasm

完成执行后,您应该能够看到文件 add.wasm。我们会将这个 Web 程序集加载到我们的 Rust 项目中。

在 Rust 中使用它

让我们使用创建一个简单的 Rust 项目


cargo new wasmer-consume

在 Cargo.toml 中添加如下依赖


wasmer = “3.1.1” wasmer-wasi = “3.1.1”

替换main.rs中的以下代码


use wasmer::{Instance, Module, Store, Value, Function}; use wasmer_wasi::{WasiState, WasiEnv, generate_import_object_from_env, WasiFunctionEnv}; fn main() -> Result<(), Box> { // Read the WebAssembly module bytes let wasm_bytes = include_bytes!("/Users/shyamsundarb/Library/cppWrk/wasmerblog/wasmer-consume/add.wasm"); // Create a new store to hold WebAssembly instances let mut store = Store::default(); // Create a new WASI state for the WASI environment let wasi_state = WasiState::new("wasi_snapshot_preview1").build()?; // Create a new WASI environment using the WASI state let wasi_env = WasiEnv::new(wasi_state); // Compile the WebAssembly module from the provided bytes let module = Module::new(&store, wasm_bytes)?; // Create a new instance of the WASI functions using the store and WASI environment let wasi_func = WasiFunctionEnv::new(&mut store, wasi_env); // Generate the import object from the WASI functions and environment let mut import_object = generate_import_object_from_env(&mut store, &wasi_func.env, wasmer_wasi::Latest); // Create a host function that exits the program let exit_func = Function::new_typed(&mut store, |i: i32| { std::exit(i); }); // Add the missing `proc_exit` function to the import object import_object.define("wasi_snapshot_preview1", "proc_exit", exit_func); // Create a new instance of the WebAssembly module with the import object let instance = Instance::new(&mut store, &module, &import_object)?; // Get the `add` function from the instance exports let add: &Function = instance.exports.get_function("add")?; // Call the `add` function with two integer arguments let result = add.call(&mut store, &[Value::I32(2), Value::I32(3)])?; // Retrieve the result value from the function call let result_value: i32 = result[0].unwrap_i32(); // Print the result println!("Result: {}", result_value); Ok(()) }

当您运行cargo run命令时,如果一切顺利,您应该会看到以下内容:

495f33c0-05f0-11ee-962d-dac502259ad0.png.

我们可以看到该函数在控制台应用程序中可用。现在让我们看看如何在浏览器中使用它。

结论

尽管这个例子很简单,但从概念上讲,它为“一次编写,到处运行”开辟了新的含义。Webassembly 作为一项技术仍处于初期阶段。它帮助我们弥合编程语言和平台之间的鸿沟。
责任编辑:彭菁

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 模块
    +关注

    关注

    7

    文章

    2484

    浏览量

    46530
  • C++
    C++
    +关注

    关注

    21

    文章

    2066

    浏览量

    72900
  • 虚拟机
    +关注

    关注

    1

    文章

    855

    浏览量

    27378

原文标题:【Rust日报】2023-06-07 使用 C++ 编写通用库并在 Rust 中使用它 (WASI)

文章出处:【微信号:Rust语言中文社区,微信公众号:Rust语言中文社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    如何在Rust中使用Memcached

    了Memcached协议的实现,使得开发者可以在Rust中使用Memcached。 基础用法 创建连接 使用Rust语言Memcached需要先创建一个连接。可以使用 memcached::Client
    的头像 发表于 09-19 16:30 883次阅读

    如何编写高性能的Rust代码

    为了最大限度地提高Rust应用程序的性能,你需要了解支持代码的底层硬件架构,如何优化算法和数据结构,以及如何对代码进行配置和基准测试。在本文中,我们将简要介绍这些主题,希望能更好地理解如何编写高性能的Rust代码。
    的头像 发表于 11-03 14:28 480次阅读
    如何<b class='flag-5'>编写</b>高性能的<b class='flag-5'>Rust</b>代码

    如何在MDK中使C++,整理的经验

    c语言调用时就是用c语言方式编译2:编写一个C++风格的头文件,在这里添加extern修饰符: (一般用在调用已经封装好的文件或者无法或
    发表于 03-10 15:32

    请问我能在C++编写任何代码吗?

    当我听到PSoC 4和板与ARDUIO SHILDS兼容时,我想知道如何将AdUINOC++文件移植到PSoC Creator。我能在C++编写任何代码吗?有可能吗?如果我要编译
    发表于 06-11 09:05

    只会用Python?教你在树莓派上开始使用Rust

    结合起来,并在Raspberry Pi上安装Rust。设置Raspberry Pi对于此项目,您将需要:Raspberry PiLED。220-1k欧姆电阻。面包板和接线。使用GPIO 18连接到LED
    发表于 05-20 08:00

    如何用C++编写流水灯程序?

    为什么很少用C++开发单片机?如何用C++编写流水灯程序?
    发表于 09-30 08:27

    怎样用c++编写程序呢

    由于我们使用的是 ARM 的工具链 是gcc的,所以,我们大可以用c++编写程序,无论是 c++99 或c++11 还是 c++14,都是
    发表于 01-26 06:58

    如何利用C语言去调用rust静态

    新语言的感觉,要做不少的对接工作。也用过Lua,感觉也差不多。评估学习评估Rust语言时,感觉性能和体积应该都不会有太大的问题。加上语言本身主打的安全性,再结合一些,用来做一些C语言不擅长的动态操作
    发表于 06-21 10:27

    Rust代码中加载静态时,出现错误 ` rust-lld: error: undefined symbol: malloc `怎么解决?

    “ [i]malloc ”、“ [i]exit ”。我验证了使用 ` [i]nm ` 命令。 问题是我打算使用 ffi 在 rust 中使用这个静态。当我尝试在我的 Rust 代码
    发表于 06-09 08:44

    Chrome团队将测试验证RustC++的互操作性

    Chrome 团队也开始尝试 Rust 了。在 Chromium 官网近期发布的文档中,“RustC++ 的互操作性”作为一项尚待解决的挑战被提出。
    的头像 发表于 08-25 10:35 1763次阅读

    Chromium正式开始支持Rust

      Chromium 正式开始支持 Rust 目前的支持只是第一阶段,在C++代码中使Rust写的第三方库(编译成.so)。估计明年Chromium的二进制发行文件中会包含
    的头像 发表于 01-14 10:04 660次阅读

    RustC++哪个更好入门

    作为一门系统编程语言,Rust 一直致力于解决高并发和高安全性系统等问题。和老牌的 C++ 相比,Rust 的性能也毫不逊色。但曾几何时,因为上手难、用户量少、社区不活跃等诸如问题让想要入门的开发者感到迷茫,如今新的一年已经开始
    的头像 发表于 03-17 14:45 1443次阅读

    如何在Rust项目中使用InfluxDB 2.x

    了更好的性能和更好的用户体验。Rust语言提供了InfluxDB 2.x的官方客户端库,可以方便地在Rust项目中使用InfluxDB 2.x。 本教程将介绍如何在Rust项目
    的头像 发表于 09-19 16:33 353次阅读

    FastTime-纯Rust编写的高并发快速时间库

    FastTime, 纯Rust编写的快速时间库, 并发: 2800万+/秒. 一、组件
    的头像 发表于 11-06 09:23 344次阅读

    谷歌捐款100万美元给Rust基金会,以增强C++Rust的交互性

    如今,谷歌多项核心业务仍以 C++为主要编程语言,虽然无法直接使用Rust替代现有的C++程序,但谷歌依然选择支持Rust基金会的“Interop Initiative”计划,帮助那些
    的头像 发表于 02-19 15:41 166次阅读