c++ - 在没有 extern "C"的情况下在 C++ 中使用 dlsym

标签 c++ g++

我有一个系统,我给用户一个函数原型(prototype),用户必须实现它。现在,我使用 g++ 编译这个文件并使用 dlopen 和 dlsym 动态加载它以进一步处理它。现在,我在这里阅读:

c++ dlopen mini-howto

要加载 C++ 函数,我们必须在函数前使用 extern "C"。现在,问题是,我不想向用户展示事情是如何运作的。我不想在函数前向用户显示 extern "C"。

有什么办法可以避免吗?

最佳答案

您可以使用 mangled C++直接命名。

如果你有一个 C++ 函数 void my_plugin(int foo) ,C++ 编译器将破坏该名称。 知道损坏的函数名称后,您可以对该名称使用 dlopen()。

例如

# nm libmyplugin.so |grep my_plugin
00000000 T _Z9my_plugini

所以这里我们的函数被命名为 _Z9my_plugini ,你可以这样做

 func = dlsym(handle, "_Z9my_plugini");

传统上,不同的编译器可能会以不同的方式破坏名称,因此这可能非常脆弱,尽管现在大多数 C++ 编译器会同意在给定平台上采用标准的方式破坏名称。

然而,您的用户将是程序员,他们通常会理解将条目公开给动态加载的库作为 extern "C"

关于c++ - 在没有 extern "C"的情况下在 C++ 中使用 dlsym,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18096596/

相关文章:

c++ - libtorrent-rasterbar7 : g++ linker unable to find libtorrent/session. hpp

c++ - opengl:基于着色器的渲染到帧缓冲区,然后是固定管道渲染

c++ - 如何从复制赋值运算符调用复制构造函数?

c++ - 如何在 C++ 中以非标准方式初始化动态内存?

c++ - 如何减少内核中分支/if 语句的数量?

c++ - 类模板中没有成员函数声明

c++ - 'goo' 未在此范围内声明,C++

c++ - 在 boost::asio 中为 SSL/TLS 使用特定密码

c++ - 如何将C++程序的已编译逻辑与其余文件头数据区分开?

c++ - 字符串问题