我想使用从 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/