首页 > 解决方案 > Go/Cgo:生成没有 Go 运行时函数定义的静态库

问题描述

有没有办法从 Go 代码生成 C 静态库,但没有 Go 运行时函数定义

理由

如果可以在没有 Go 运行时定义的情况下生成其库,则可以project C轻松project D解决所面临的问题。可以链接到. 将链接到,和一些将包含所有 Go 运行时内容的定义。project AProject ClibA.aProject DlibA.alibA2.alibGo.a

我尝试了什么:

客户端的任何解决方案(例如在链接阶段找到忽略重复定义的正确方法project C)也将被视为有效答案。
如果提供足够的证据,我也可以接受否定答案(没有解决方案)。

更新:查看相关问题Is there a way to include multiple c-archive packages in a single binary

标签: cgolinkerstatic-librariescgo

解决方案


-buildmode=c-archive正如您所发现的,在当前的实现中,多次使用并将结果放入多个共享库是行不通的。基本问题是 Go 运行时必须只有一个,但你有多个运行时。使用-buildmode=c-archive时无法隔离不同的运行时。

这些-buildmode=c-shared库的不同之处buildmode=c-archive在于它们是用它构建的,-Bsymbolic它强制所有本地引用都是本地的。效果是我们有多个 Go 运行时,但它们不相互引用,所以没有混淆。

如果您的 C 代码介意-Wl,-Bsymbolic与.c-archive-Bsymbolic

祝你好运。


推荐阅读