我有一个包含void initGui()
功能的文件。它做的东西。
我还有一个用该文件制作的.so
共享库。
问题是,当我尝试启动dlsym(..., "initGui")
时,dlerror()
告诉我它没有找到符号(当然,我使用dlopen
打开它)。所以我尝试nm
我的共享库。我“理解”_Z7initGuiiii
可能就是我正在寻找的东西。所以我试着dlsym
它......它起作用了。
有人可以告诉我如何在共享对象库中使用干净的符号吗?
我使用g++ -Wall -Wextra -Werror -c -fPIC
编译。
答案 0 :(得分:3)
dlsym
- 在C ++中编码的某些dlopen
- ed共享库中的常规做法是具有这样的约定,即那些寻找符号(那些你是dlsyming)的符号被声明为{{ 1}}。然后使用extern "C"
可以轻松看到他们的名字。所以你需要声明
dlsym
然后去做
extern "C" void initGui(void);
我不建议详细了解您的C++ name mangling works,它的定义不是很明确,详细信息取决于特定版本的C ++库(特别是标准C ++库)和编译器版本。