我想使用从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]
所以我的问题更多,甚至有可能构建这样的东西。
谢谢。
答案 0 :(得分:0)
那不会飞:GOARCH=wasm GOOS=js
基本上使Go编译器从 Go源代码生成 wasm字节码。换句话说, Go代码被编译为WASM字节码和WASM API调用,而不是针对特定OS内核的CPU专用机器代码和系统调用。
另一方面,cgo
是将已编译 C代码与已编译 Go代码进行链接的一种方法。为了使用cgo
来编译程序,go
工具链会调用一个真正的C编译器(大多数情况下,gcc
)来编译C部分。
编译的C代码和WASM字节码存在于不同的Universe中,并且彼此不了解。从理论上讲,像gcc
这样的C编译器可以支持WASM(就像go
一样),但是IIRC既不是这种情况,也不是Go的WASM后端被教导如何处理这种情况。
总而言之,使用cgo
的最典型情况是与已经存在的用C编写的库(或公开与C兼容的API)交互,并且大多数此类库通常对它们所运行的环境-通常是POSIX兼容的OS(带有一组处理文件和套接字I / O的syscalls)。
因此,如果您极少需要与“纯” C库链接,该C库执行纯数据处理并且不以任何方式与基础OS进行通信,则可以查看C-to-Go源代码翻译器。