Golang编译Wasmer失败:链接错误问题求助
调用WebAssembly的Go程序链接错误修复
问题描述
尝试构建一个调用WebAssembly的Go程序,代码如下:
package main import ( _ "embed" "fmt" "log" "github.com/mattn/gowasmer" ) //go:embed main.wasm var webassembly []byte func main() { inst, err := gowasmer.NewInstance(webassembly) if err != nil { log.Fatal(err) } m := inst.Get("fn") r := m.(func([]interface{}) interface{})([]interface{}{1, 3}) fmt.Printf("1 + 3 = %v\n", r) }
运行时出现链接错误,错误信息如下:
PS C:\Users\Nigel\Desktop\wasi> wasmer --version wasmer 4.0.0 PS C:\Users\Nigel\Desktop\wasi> go run . # github.com/wasmerio/wasmer-go/wasmer ..\..\go\pkg\mod\github.com\wasmerio\wasmer-go@v1.0.4\wasmer\wasi.go: In function 'to_wasi_env_read_inner': ..\..\go\pkg\mod\github.com\wasmerio\wasmer-go@v1.0.4\wasmer\wasi.go:23:22: warning: implicit declaration of function 'open_memstream' [-Wimplicit-function-declaration] 23 | // memory_stream = open_memstream(buffer, &buffer_size); | ^~~~~~~~~~~~~~ ..\..\go\pkg\mod\github.com\wasmerio\wasmer-go@v1.0.4\wasmer\wasi.go:23:20: warning: assignment to 'FILE *' {aka 'struct _iobuf *'} from 'int' makes pointer from integer without a cast [-Wint-conversion] 23 | // memory_stream = open_memstream(buffer, &buffer_size); | ^ # main C:\Program Files\Go\pkg\tool\windows_amd64\link.exe: running gcc failed: exit status 1 C:/ProgramData/chocolatey/lib/mingw/tools/install/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: cannot find -lwasmer: No such file or directory collect2.exe: error: ld returned 1 exit status
修复步骤
1. 配置链接器找到Wasmer库(临时方案)
错误核心是链接器找不到libwasmer库,Windows下可通过以下方式解决:
- 定位Wasmer的安装目录,Chocolatey安装的路径通常为
C:\ProgramData\chocolatey\lib\wasmer,手动安装则可能在C:\Users\Nigel\.wasmer - 将Wasmer的
lib目录添加到LIB环境变量,再运行程序:$env:LIB += ";C:\Users\Nigel\.wasmer\lib" go run .
2. 改用纯Go后端的Wasmer绑定(推荐方案)
github.com/mattn/gowasmer依赖C版Wasmer库,容易出现跨平台链接问题。推荐使用github.com/wasmerio/wasmer-go的纯Go后端,无需依赖C库:
- 修改代码导入路径及实例初始化逻辑:
package main import ( _ "embed" "fmt" "log" "github.com/wasmerio/wasmer-go/wasmer" ) //go:embed main.wasm var webassembly []byte func main() { // 初始化纯Go引擎和存储 engine := wasmer.NewEngine() store := wasmer.NewStore(engine) // 编译Wasm模块 module, err := wasmer.NewModule(store, webassembly) if err != nil { log.Fatal(err) } // 创建实例 instance, err := wasmer.NewInstance(module, wasmer.NewImportObject()) if err != nil { log.Fatal(err) } defer instance.Close() // 获取并调用函数 fn, err := instance.Exports.GetFunction("fn") if err != nil { log.Fatal(err) } result, err := fn(1, 3) if err != nil { log.Fatal(err) } fmt.Printf("1 + 3 = %v\n", result) } - 执行
go mod tidy更新依赖,之后直接运行即可,无需额外配置C库,同时open_memstream的警告也会自动消失。
内容的提问来源于stack exchange,提问作者nigel239
相关产品推荐
相关产品推荐

