为了账号安全,请及时绑定邮箱和手机立即绑定

dylib 中缺少符号

dylib 中缺少符号

Go
冉冉说 2021-11-15 15:17:44
我正在尝试围绕 C++ 库制作 C api,以便我以后可以将它包装在 Golang 中。我首先简单地用一个函数生成一个 dylib,以便我有一个参考。然后我围绕我想要使用的实际库制作了一个包装器。当我从简单的 dylib 生成所有符号时,我得到了这个:MacbookMainframe:c hydroflame$ nm -a clib/libxyz.dylib 0000000000000f90 T _Hello                 U dyld_stub_binder我只声明了一个名为 的函数Hello,到目前为止一切顺利当我做了我认为对实际库等效的操作时,go 包装器不会编译,并且符号在何处生成MacbookMainframe:c hydroflame$ nm -a ../luxengine.net/steamc/libsteam.dylib                  U _SteamAPI_Init0000000000000f60 T __Z14SteamCAPI_Initv                 U dyld_stub_binder我期待的符号是_SteamCAPI_Init(带有下划线,因为显然是Hello生成的,_Hello但我得到了一些奇怪的东西。我的编译是错误的,还是应该生成的正常符号?源文件在这里可用(只有 30 条重要的行):https : //github.com/luxengine/steamhttps://github.com/luxengine/steamc编辑(对于未来的读者):在撰写本文时我的问题是我的头文件声明有extern "C" {但我的源文件没有,所以无论如何 gcc 都会破坏名称而 cgo 找不到它。MacbookMainframe:steamc hydroflame$ nm -a libsteam.dylib                  U _SteamAPI_Init0000000000000f60 T _SteamCAPI_Init                 U dyld_stub_binder
查看完整描述

1 回答

?
海绵宝宝撒

TA贡献1809条经验 获得超8个赞

首先,dyld_stub_binder是编译C++时默认生成的符号。你不需要关心它。

其次,__Z14SteamCAPI_Initv实际上是正确的符号。由于 C++ 支持重载,因此 C++ 函数编译时使用了经过修改的符号名称,因此函数名称不会相互冲突。例如,您有两个函数void do_something(int a)void do_something(int a, int b),如果函数名没有被破坏,链接器将如何解析符号名。

可以在此处找到有关 C++ 名称修改的信息。


查看完整回答
反对 回复 2021-11-15
  • 1 回答
  • 0 关注
  • 192 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信