CGO 库构建到 JS WASM 文件
CGO library build to JS WASM file
我想使用从 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 特定的机器代码和系统调用特定的 OS 内核。
另一方面,cgo
是link编译C代码的一种方式编译 Go代码。要编译使用 cgo
的程序,go
工具链调用真正的 C 编译器(gcc
大多数时间),它编译 C 部分。
编译后的C代码和WASM字节码存在于不同的宇宙中,互不了解。理论上,像 gcc
这样的 C 编译器可以支持 WASM——就像现在 go
一样——但 IIRC 既不是这种情况,也没有教导 Go 的 WASM 后端以某种方式处理这种情况。
总而言之,使用 cgo
的最典型情况是与现有的用 C 编写的库进行交互(或公开与 C 兼容的 API),并且其中的大多数库通常对它们 运行 所在的环境做出深刻的假设——通常是 POSIX 兼容的 OS(有一组系统调用来处理文件和套接字 I/O等等)。
因此,如果您很少需要 link 使用 "pure" C 库——它执行纯数据处理并且不与底层 OS 通信无论如何,都可以查看 C-to-Go 源代码翻译器。
我想使用从 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 特定的机器代码和系统调用特定的 OS 内核。
另一方面,cgo
是link编译C代码的一种方式编译 Go代码。要编译使用 cgo
的程序,go
工具链调用真正的 C 编译器(gcc
大多数时间),它编译 C 部分。
编译后的C代码和WASM字节码存在于不同的宇宙中,互不了解。理论上,像 gcc
这样的 C 编译器可以支持 WASM——就像现在 go
一样——但 IIRC 既不是这种情况,也没有教导 Go 的 WASM 后端以某种方式处理这种情况。
总而言之,使用 cgo
的最典型情况是与现有的用 C 编写的库进行交互(或公开与 C 兼容的 API),并且其中的大多数库通常对它们 运行 所在的环境做出深刻的假设——通常是 POSIX 兼容的 OS(有一组系统调用来处理文件和套接字 I/O等等)。
因此,如果您很少需要 link 使用 "pure" C 库——它执行纯数据处理并且不与底层 OS 通信无论如何,都可以查看 C-to-Go 源代码翻译器。