dylib中缺少符号
Missing symbols from a dylib
我正在尝试围绕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_Init
0000000000000f60 T __Z14SteamCAPI_Initv
U dyld_stub_binder
我期待的符号是_SteamCAPI_Init
(下划线,因为显然Hello
生成_Hello
,但我得到了一些奇怪的东西。
是我的编译错误,还是应该生成正常的符号?
源文件可在这里获得(只有大约30行重要行):
https://github.com/luxengine/steam
https://github.com/luxengine/steamc
编辑(供将来的读者使用):
我在写的时候的问题是,我的头文件声明有extern "C" {
,但我的源文件没有,所以gcc会把名字弄乱,而cgo找不到它。
MacbookMainframe:steamc hydroflame$ nm -a libsteam.dylib
U _SteamAPI_Init
0000000000000f60 T _SteamCAPI_Init
U dyld_stub_binder
首先,dyld_stub_binder
是编译c++时默认生成的符号。你不需要关心它。
其次,__Z14SteamCAPI_Initv
实际上是正确的符号。由于c++支持重载,c++函数是用混乱的符号名编译的,这样函数名就不会相互冲突。例如,您有两个函数void do_something(int a)
和void do_something(int a, int b)
,如果函数名没有混淆,链接器将如何解析符号名?
关于c++名称混淆的信息可以在这里找到
相关文章:
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 将无符号char*转换为std::istream*C++
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- vscode g++链路故障:体系结构x86_64的未定义符号
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- 使用gcc从静态链接的文件中查找可选符号
- C++中无符号字符溢出
- 使用无符号字符数组有效存储内存
- C++:Application.cpp中抛出了未解析的外部符号(解决方案在问题的末尾,供未来的读者参考)
- VC++本机单元测试,找不到调试符号
- 为什么我必须在C++中添加一个赋值符号来声明一个数组
- 检查TCHAR数组输入是否为带符号整数C++
- 用符号版本替换对函数的所有调用
- 未解析的外部符号_MsiLocateComponentW@12.
- 在Xcode中调试一个没有调试符号的dylib
- CMake和Dylib:符号定义
- dylib中缺少符号