You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 10:49:50