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