Ger*_*ald 5 macos xcode symbols dylib
我一直在尝试用 C++ 开发一个可以在应用程序中运行时加载的动态库。我终于成功了,但它有点难看。我有一个函数,它将指向 C++ 类的指针作为参数,如下所示:
bool registerGrindPlugin( Grind::PluginManager* mgr );
Run Code Online (Sandbox Code Playgroud)
但当然它被导出为:
_Z19registerGrindPluginPN5Grind13PluginManagerE
Run Code Online (Sandbox Code Playgroud)
我尝试了一个带有简单函数的 .c 文件,它可以很好地导出为“registerGrindPlugin”,但当然我不能以这种方式传递 C++ 类作为参数。
所以...我的问题是,有没有办法对导出的符号进行解开或别名,这样我就不必在 dlsym 调用中使用像 Z19registerGrindPluginPN5Grind13PluginManagerE 这样的怪物?
我确实看到了一些关于 -alias_list 作为链接器选项的内容,但我还没有完全弄清楚如何在 Xcode 中使用它。如果这是解决方案,有人可以提供有关如何使用它的更多详细信息吗?
通常,插件接口是使用 c 命名和调用约定来定义的。名称修改可能与编译器相关(非标准)。
因此,最简单的解决方案是定义一些接口函数并将其声明为extern "C":
extern "C" {
bool registerGrindPlugin( Grind::PluginManager* mgr );
}
Run Code Online (Sandbox Code Playgroud)
您可能必须将 Grid::PluginManager 替换为 void* 类型和内部强制转换。这必须是一个简单的结构,而不是具有虚函数的类。
如果您确实坚持处理损坏的名称,您可以查看“c++filt”的源代码,它是一个 GNU 实用程序,也可在 OS X 上使用。
| 归档时间: |
|
| 查看次数: |
3591 次 |
| 最近记录: |