go - CGO 库构建到 JS WASM 文件

标签 go webassembly cgo

我想使用从 Golang 构建的 webassembly 库编写 JS 脚本。 但我需要使用 C 库并通过 CGO 使用它。

简而言之,我的代码如下所示(只是加载 C 库的示例):

package main

/*
#include <stdlib.h>
*/
import "C"

func main() {
    println("Hello")
}

但是当我想像在教程中那样使用下面的命令构建它时,我遇到了错误。

命令:

GOARCH=wasm GOOS=js go build -o lib.wasm test.go

输出:

can't load package: package main: build constraints exclude all Go files in [Project path]

所以我的问题是,是否有可能构建这样的东西。

谢谢。

最佳答案

那不会飞:GOARCH=wasm GOOS=js 基本上使 Go 编译器从 Go 源代码生成 wasm 字节码换句话说,Go 代码被编译为 WASM 字节码和 WASM API 调用,而不是特定于 CPU 的机器代码和对特定操作系统内核的系统调用。

另一方面,cgo 是一种链接编译 C 代码与编译 Go 的方法代码。要编译使用 cgo 的程序,go 工具链会调用真正的 C 编译器(大多数情况下是 gcc),它会编译C部分。

编译后的 C 代码和 WASM 字节码存在于不同的宇宙中,彼此不了解。理论上,像 gcc 这样的 C 编译器可以支持 WASM——就像现在的 go 一样——但 IIRC 既不是这种情况,Go 的 WASM 后端也没有被教导以某种方式处理这种情况。

总而言之,使用 cgo 的最典型情况是与一个已经存在的用 C 编写的库交互(或暴露一个 C 兼容的 API),并且大多数这样的库通常使对它们运行的​​环境有深刻的假设——通常是一个 POSIX 兼容的操作系统(有一组系统调用来处理文件和套接字 I/O 等)。

因此,如果您很少需要链接“纯”C 库——它执行纯数据处理并且不以任何方式与底层操作系统通信,则可以查看C-to-Go 源代码转换器。

关于go - CGO 库构建到 JS WASM 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54946214/

相关文章:

http - Go 中的虚拟主机

c# - 本地 TCP 服务器使用哪个地址?

javascript - 如何从 JavaScript 执行 Kotlin WebAssembly 函数?

c++ - 如何将 C++ 库与 CGO 和 Swig 链接起来?

cgo - 如何将字符串转换为 C 固定字符数组

go - 我应该如何在 Go 中定义一个空 slice ?

go - 如何使用 go-ldap 模块将成员添加到 GroupOfNames 中?

c++ - 键盘输入不适用于 WebAssembly 和 Emscripten

blazor - 在 Blazor WASM 启动时加载初始数据的最佳位置在哪里

c - 如何将 Go 绑定(bind)建模为使用 union 的 C 结构?