Не удалось вызвать функции при запуске файла wasm с помощью wasmtime - PullRequest
0 голосов
/ 17 октября 2019

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 и попытался создать программу 'hello world' с Clang .

Я создал две функции в 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?

1 Ответ

0 голосов
/ 19 октября 2019

Разница в том, что в инструментальной цепочке Rust есть экспериментальная поддержка типов интерфейса, а для C, к сожалению, пока нет. #[wasm_bindgen] над функцией render - это то, что превращает render в функцию, экспортируемую с привязками типов интерфейса.

...