如何在 macOS 上的 Xcode 动态库中解开从 C++ 导出的符号

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 中使用它。如果这是解决方案,有人可以提供有关如何使用它的更多详细信息吗?

nim*_*odm 2

通常,插件接口是使用 c 命名和调用约定来定义的。名称修改可能与编译器相关(非标准)。

因此,最简单的解决方案是定义一些接口函数并将其声明为extern "C"

extern "C"  {
    bool registerGrindPlugin( Grind::PluginManager* mgr );
}
Run Code Online (Sandbox Code Playgroud)

您可能必须将 Grid::PluginManager 替换为 void* 类型和内部强制转换。这必须是一个简单的结构,而不是具有虚函数的类。

如果您确实坚持处理损坏的名称,您可以查看“c++filt”的源代码,它是一个 GNU 实用程序,也可在 OS X 上使用。