Mozilla 分享了WASI以及如何使用Wasmtime运行 . wasm文件在他们的博客文章中。他们演示的编程语言是Rust:
#[wasm_bindgen]
pub fn render(input: &str) -> String {
let parser = Parser::new(input);
let mut html_output = String::new();
html::push_html(&mut html_output, parser);
return html_output;
}
但是,我想在C中做同样的事情。
我已经下载了wasi-libc并尝试使用Clang构建一个“hello world”程序。
我在test.c中创建了两个函数:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int foo1()
{
printf("Hello foo1()\n");
return 0;
}
int foo2(char* filename)
{
printf("Hello foo2()\n");
printf("filename is %s\n", filename);
return 0;
}
使用以下命令构建它:
clang --target=wasm32-wasi --sysroot=/mnt/d/code/wasi-libc/sysroot test.c -o test.wasm -nostartfiles -Wl,--no-entry,--export=foo1,--export=foo2
运行 wasm 文件以调用函数:
$ wasmtime test.wasm --invoke foo1
Hello foo1()
warning: using `--render` with a function that returns values is experimental and may break in the future
0
$ wasmtime test.wasm --invoke foo2 "hello"
warning: using `--render` with a function that takes arguments is experimental and may break in the future
error: failed to process main module `test.wasm`
caused by: invalid digit found in string
我未能使用输入参数调用该函数。
Rust 和 C 有什么区别?Rust 目前是构建 wasm lib 文件的唯一方法吗?