链接共享库g ++时的奇怪符号

时间:2013-03-20 19:14:16

标签: linux g++ shared-libraries dynamic-linking symbols

我有一个包含void initGui()功能的文件。它做的东西。 我还有一个用该文件制作的.so共享库。

问题是,当我尝试启动dlsym(..., "initGui")时,dlerror()告诉我它没有找到符号(当然,我使用dlopen打开它)。所以我尝试nm我的共享库。我“理解”_Z7initGuiiii可能就是我正在寻找的东西。所以我试着dlsym它......它起作用了。

有人可以告诉我如何在共享对象库中使用干净的符号吗?

我使用g++ -Wall -Wextra -Werror -c -fPIC编译。

1 个答案:

答案 0 :(得分:3)

dlsym - 在C ++中编码的某些dlopen - ed共享库中的常规做法是具有这样的约定,即那些寻找符号(那些你是dlsyming)的符号被声明为{{ 1}}。然后使用extern "C"可以轻松看到他们的名字。所以你需要声明

dlsym

然后去做

 extern "C" void initGui(void);

我不建议详细了解您的C++ name mangling works,它的定义不是很明确,详细信息取决于特定版本的C ++库(特别是标准C ++库)和编译器版本。