繁体   English   中英

Go/Cgo:生成没有定义 Go 运行时函数的 static 库

[英]Go/Cgo: produce static library without definitions of Go runtime functions

Is there a way to produce a C static library from Go code, but without Go runtime function definitions ?

理由

  • Project A使用go build -buildmode=c-archive , libA.a创建一个 C static 库。
  • 运行良好: project B使用纯 C 并且能够轻松创建可执行文件,与libA.a静态链接,一切都很好。
  • 问题 1: project C恰好也使用 Go,但想将libA.a用作常规 C 库 现在它有一个链接问题:Go 运行时函数,例如_cgo_panic现在在project C运行时(因为它使用 Go)和libA.a中都定义了。
  • 问题 2: project D使用纯 C,与 B 相同。但它想使用project A中的两个不同库,例如libA.a和一些libA2.a 遗憾的是,它也没有链接,因为 Go 运行时函数现在在libA.alibA2.a中都定义了。

如果project A可以在没有 Go 运行时定义的情况下生成其库,则project Cproject D面临的问题可以很容易地解决。 Project C可以与libA.a链接。 Project D将与libA.alibA2.a和一些libGo.a链接,其中包含所有 Go 运行时内容的定义。

我尝试了什么:

  • 在“项目 C”级别使用 linker 标志,例如 -Wl -Wl,--allow-multiple-definition 现在它的构建失败,并显示一条神秘消息“ function 符号表未按程序计数器排序”。
  • 从“libA.a”中手动删除go.o (因为它只是一个“ar”存档):不起作用,因为“go.o”还包含我导出函数的实现,所以我删除了太多。
  • 使用go build -buildmode=c-shared 正如预期的那样,它生成了一个使用另一种格式的动态库,所以我不能直接将它用作 static 库。

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

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

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

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

如果您的 C 代码不介意与-Bsymbolic链接,您可以尝试添加-Wl,-Bsymbolic以在c-archive中构建包含 Go 代码的每个共享库。

祝你好运。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM