使用了 cgo 的库该如何分发?
有一个 Rust 写的库提供了 C ABI 的调用方式,我觉得这个库挺有趣的,就尝试给它写了一个 binding:
https://github.com/CoolSpring8/go-lolhtml
(存在的问题还比较多,无意推广,只是考虑到给出问题的具体情境更好理解)
问题来了,虽然在 go build 时指定 CGO_ENABLED=1 可以让 CC 参数指定的编译器编译工作目录下的 C/C++ 源文件,但是这个库需要调用 cargo 来编译。
我在开发时采用的方案是预先使用 cargo build –release 得到静态库或者动态库,然后在 Go 文件头部指定以下注释:
#cgo CFLAGS: -I${SRCDIR}/lol-html/c-api/include #cgo LDFLAGS: -L${SRCDIR}/lol-html/c-api/target/release -llolhtml
但是到了 push 到 GitHub 后,尝试新建一个项目引用 import path 写 demo 时,才发现问题:
在启用 go mod 的情况下,go get 之后( go get 不会下载 git submodule 是另一个问题了,容易解决),它依赖的 Rust 库怎么办呢?
cd 到 $GOPATH/pkg/mod/github.com/... 去 make 之类的应该不可行,修改文件夹内容之后 module 的 sum 会改变,会无法使用。
总结起来:
cgo
+ non-main package (不能通过发布预编译二进制的方案)
+ no official library distribution (不能像大部分 binding 一样要求用户用包管理器安装对应包后,调用系统动态库,例如 ffmpeg 的 binding )
+ go module (不能先 git clone 再 make 最后 go install 。所以看起来如果要用 go module 只能将依赖的 Rust 库事先安装为动态库了?)
看了网络上能搜索到的资料,都无法解决我的问题。感觉难点都撞在一起了,好纠结……