CGO库构建为JS WASM文件

时间:2019-03-01 14:01:08

标签: 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]

所以我的问题更多,甚至有可能构建这样的东西。

谢谢。

1 个答案:

答案 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源代码翻译器。