Golang 到 wasm 的编译

3

我使用 Golang 编译器将代码编译为 wasm 格式。

GOOS=js GOARCH=wasm go build -o main.wasm

当我尝试使用wasmtime执行时,我遇到了以下错误

wasmtime main.wasm 
Error: failed to run main module `main.wasm`

Caused by:
    0: failed to instantiate "main.wasm"
    1: unknown import: `go::debug` has not been defined

使用wasm3执行时,我得到了

wasm3 main.wasm 
Error: function lookup failed ('_start')

这些错误是什么意思,如何修复它们?


我进一步详细探讨了选项3,并在我的答案中添加了一个编辑。实际上,它比我最初想象的要容易得多。 - TachyonicBytes
1个回答

5

目前还没有办法使用Go编译器在浏览器之外生成wasm。你示例中的main.wasm是用于与wasm_exec.js桥接程序一起使用的。但是,有方法可以在Node中使用它。是我以前在同一主题上的答案。所以,你的选择是:

  1. 像上面链接的问题一样使用Node
node wasm_exec.js main.wasm
  1. 使用支持wasi的tinygo进行编译
tinygo build -target=wasi -o main.wasm main.go

wasmtime 应该可以很好地运行这个。

  1. 第三个秘密选项:Go实际上在浏览器之外对wasm有非常非常前沿的支持。我不认为任何发布版本的go编译器都启用了该功能,所以您可能需要从源代码编译go。编译完成后,您的命令应该变成:
GOOS=wasip1 GOARCH=wasm go build -o main.wasm

针对您的问题,我建议选择(1),以便至少有一些可用的东西,并且如果您想要独立运行它,则选择(2)wasmtime。如果您不想自己编译,新的go版本也很快就会发布。

编辑:

我有时间自己研究了一下。似乎选项3并不难自己完成:

我按照这里的说明获取了最新的go源代码构建,只需要:

go install golang.org/dl/gotip@latest
gotip download

在进行引导之前,您必须已经安装了go,但是任何最近的版本都可以。按照这些说明后,您可以像使用go一样使用gotip。因此,您的命令变成:

GOOS=wasip1 GOARCH=wasm gotip build -o main.wasm

由于 wasmtime 支持 wasi,因此您应该能够在不对命令进行其他修改的情况下运行程序。

如果您有足够强大的计算机,编译 gotip 也不会花费太多时间。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接