CGO 库构建到 JS WASM 文件

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

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


犯罪嫌疑人X
浏览 134回答 1
1回答

蓝山帝景

那不会飞:基本上让 Go 编译器从Go 源代码GOARCH=wasm GOOS=js生成wasm 字节码。换句话说,Go 代码被编译为 WASM 字节码和 WASM API 调用,而不是特定于 CPU 的机器代码和对特定操作系统内核的系统调用。另一方面,是一种将编译后的C 代码与编译后的Go 代码链接起来cgo的方法。为了编译一个使用 的程序,工具链调用一个真正的 C 编译器(大部分时间),它编译 C 部分。cgogogcc编译后的 C 代码和 WASM 字节码存在于不同的宇宙中,彼此不了解。从理论上讲,C 编译器gcc可以支持 WASM——就像go现在一样——但 IIRC 既不是这种情况,也没有教导 Go 的 WASM 后端以某种方式处理这种情况。总而言之,最典型的使用案例cgo是与一个用 C 编写的现有库接口(或公开一个与 C 兼容的 API),并且大多数此类库通常会对它们运行的环境做出深刻的假设——这通常是一个 POSIX 兼容的操作系统(具有一组系统调用来处理文件和套接字 I/O 等)。因此,如果您极少需要链接“纯”C 库——它执行纯数据处理并且不以任何方式与底层操作系统通信,则可以查看 C-to -Go 源代码翻译器。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go