RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

使用C++編寫通用庫并在 Rust 中使用它 (WASI)

jf_wN0SrCdH ? 來源:Rust語言中文社區(qū) ? 2023-06-16 10:03 ? 次閱讀

使用 C++ 編寫通用庫并在 Rust 中使用它 (WASI)

WebAssembly 簡介

WebAssembly 是一種二進制指令格式,旨在成為一種低級虛擬機,可以在 Web 瀏覽器中以接近本機的速度運行代碼。它不特定于網(wǎng)絡(luò),也可以在其他平臺上運行。WebAssembly 代碼可以從各種編程語言編譯而來,例如 C、C++、Rust、C# 等。 Wasmer 是一個輕量級且快速的 WebAssembly 運行時,可以在各種平臺上運行 WebAssembly 模塊,包括 Windows、Linux 和 macOS。Wasmer 支持多種編程語言,包括 C、C++、Rust 等。

使用 C++ 創(chuàng)建 WebAssembly 庫

首先,我們將使用 C++ 創(chuàng)建一個簡單的“加法”函數(shù),它將兩個整數(shù)作為輸入并返回它們的和。


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

在這段代碼中,我們將使用 Rust 中的 add 函數(shù)。使用外部“C”是為了使函數(shù)“add”不被編譯器破壞。我們將不得不在我們的 Rust 代碼中使用相同的名稱。以下是將代碼編譯為 WebAssembly 的更新命令:


wasmc++ add.cpp -o add.wasm

完成執(zhí)行后,您應(yīng)該能夠看到文件 add.wasm。我們會將這個 Web 程序集加載到我們的 Rust 項目中。

在 Rust 中使用它

讓我們使用創(chuàng)建一個簡單的 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(()) }

當(dāng)您運行cargo run命令時,如果一切順利,您應(yīng)該會看到以下內(nèi)容:

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

我們可以看到該函數(shù)在控制臺應(yīng)用程序中可用?,F(xiàn)在讓我們看看如何在瀏覽器中使用它。

結(jié)論

盡管這個例子很簡單,但從概念上講,它為“一次編寫,到處運行”開辟了新的含義。Webassembly 作為一項技術(shù)仍處于初期階段。它幫助我們彌合編程語言和平臺之間的鴻溝。
責(zé)任編輯:彭菁

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 模塊
    +關(guān)注

    關(guān)注

    7

    文章

    2689

    瀏覽量

    47418
  • C++
    C++
    +關(guān)注

    關(guān)注

    22

    文章

    2107

    瀏覽量

    73591
  • 虛擬機
    +關(guān)注

    關(guān)注

    1

    文章

    914

    瀏覽量

    28153

原文標題:【Rust日報】2023-06-07 使用 C++ 編寫通用庫并在 Rust 中使用它 (WASI)

文章出處:【微信號:Rust語言中文社區(qū),微信公眾號:Rust語言中文社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    如何在Rust中使用Memcached

    Memcached是一種高性能、分布式的內(nèi)存對象緩存系統(tǒng),可用于加速動態(tài)Web應(yīng)用程序。Rust是一種系統(tǒng)級編程語言,具有內(nèi)存安全、高性能和并發(fā)性等特點。Rust語言的Memcached提供了
    的頭像 發(fā)表于 09-19 16:30 ?1227次閱讀

    FX2 CY7C68013A如何在C++環(huán)境中使用LoadEEPROM函數(shù)?

    我使用的是 FX2 CY7C68013A 芯片。 我知道 CyUSB.NET 中有我需要的 LoadEEPROM 函數(shù)。 請問如何在 C++ 環(huán)境而不是 C#/CLR 環(huán)境
    發(fā)表于 05-31 06:59

    Rust代碼中加載靜態(tài)時,出現(xiàn)錯誤 ` rust-lld: error: undefined symbol: malloc `怎么解決?

    “ [i]malloc ”、“ [i]exit ”。我驗證了使用 ` [i]nm ` 命令。 問題是我打算使用 ffi 在 rust 中使用這個靜態(tài)。當(dāng)我嘗試在我的 Rust 代碼
    發(fā)表于 06-09 08:44

    c++標準手冊

    C++的標準手冊,新手學(xué)習(xí)的好資料,同時也是開發(fā)人員的必備手冊。里面涵蓋了標準C++的所有的庫函數(shù)。
    發(fā)表于 11-03 14:05 ?43次下載

    如何在C++代碼中使C頭文件

    12.3 在C target=_blank style=cursor:pointer;color:#D05C38;text-decoration:underline;》C++中使
    發(fā)表于 10-19 09:24 ?3次下載

    Chrome團隊將測試驗證RustC++的互操作性

    Chrome 團隊也開始嘗試 Rust 了。在 Chromium 官網(wǎng)近期發(fā)布的文檔中,“RustC++ 的互操作性”作為一項尚待解決的挑戰(zhàn)被提出。
    的頭像 發(fā)表于 08-25 10:35 ?1945次閱讀

    微軟開始嘗試使用Rust代替C/C++,介紹這些運用Rust的產(chǎn)品

    微軟擁有世界上最大的C/C++代碼之一。從Windows、Office到Azure云,微軟的所有核心產(chǎn)品都在該代碼上運行。但因為C++
    的頭像 發(fā)表于 09-03 10:09 ?4130次閱讀

    C++ STM32 編程 005 用c++編寫STM32程序的準備

    ? ? ? ? 由于我們使用的是 ARM 的工具鏈 是gcc的,所以,我們大可以用c++編寫程序,無論是 c++99 或c++11 還是 c
    發(fā)表于 12-02 14:36 ?5次下載
    <b class='flag-5'>C++</b> STM32 編程 005 用<b class='flag-5'>c++</b><b class='flag-5'>編寫</b>STM32程序的準備

    KEIL中使C++注意事項

    KEIL中使C++ 注意事項、操作指南、書寫規(guī)范大全。
    發(fā)表于 06-01 16:12 ?1次下載

    Rust語言助力Android內(nèi)存安全漏洞大幅減少

    從 Android 12 開始,Google 就在 Android 系統(tǒng)中帶來了 Rust 語言的支持,作為 C/C++ 的替代方案,他們的目標并不是把現(xiàn)有的 C/
    發(fā)表于 12-06 17:56 ?668次閱讀

    Chromium正式開始支持Rust

    ? Chromium 正式開始支持 Rust 目前的支持只是第一階段,在C++代碼中使Rust寫的第三方(編譯成.so)。估計明年Chr
    的頭像 發(fā)表于 01-14 10:04 ?966次閱讀

    RustC++哪個更好入門

    作為一門系統(tǒng)編程語言,Rust 一直致力于解決高并發(fā)和高安全性系統(tǒng)等問題。和老牌的 C++ 相比,Rust 的性能也毫不遜色。但曾幾何時,因為上手難、用戶量少、社區(qū)不活躍等諸如問題讓想要入門的開發(fā)者感到迷茫,如今新的一年已經(jīng)開始
    的頭像 發(fā)表于 03-17 14:45 ?1927次閱讀

    CC++編寫環(huán)境下LabVIEW如何調(diào)用動態(tài)?

    C語言編寫的動態(tài)鏈接相比,不同的地方在于extern int “C” __declspec(dllexport) add(int x,int y) 這一導(dǎo)出語句,在
    發(fā)表于 06-11 09:15 ?7697次閱讀
    <b class='flag-5'>C</b>和<b class='flag-5'>C++</b><b class='flag-5'>編寫</b>環(huán)境下LabVIEW如何調(diào)用動態(tài)<b class='flag-5'>庫</b>?

    FastTime-純Rust編寫的高并發(fā)快速時間

    FastTime, 純Rust編寫的快速時間, 并發(fā): 2800萬+/秒. 一、組件
    的頭像 發(fā)表于 11-06 09:23 ?627次閱讀

    谷歌捐款100萬美元給Rust基金會,以增強C++Rust的交互性

    如今,谷歌多項核心業(yè)務(wù)仍以 C++為主要編程語言,雖然無法直接使用Rust替代現(xiàn)有的C++程序,但谷歌依然選擇支持Rust基金會的“Interop Initiative”計劃,幫助那些
    的頭像 發(fā)表于 02-19 15:41 ?636次閱讀
    RM新时代网站-首页