2

我有一个包含void initGui()函数的文件。它做事。我也有一个.so用该文件制作的共享库。

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

请有人能告诉我如何在我的共享对象库中有干净的符号吗?

我用g++ -Wall -Wextra -Werror -c -fPIC.

4

1 回答 1

3

dlsym在用 C++ 编码的某些 -ed 共享库中 -ing时的通常做法dlopen是声明那些寻找的符号(那些你正在 dlsym-ing 的符号)的约定extern "C"。然后他们的名字很容易用dlsym. 所以你需要声明

 extern "C" void initGui(void);

然后做

 typedef void initguiroutine_sig_t(void);
 initguiroutine_sig_t* initguiptr = dlsym(dlhandle,"initGui");
 if (!initguiptr) { 
    fprintf(stderr, "initGui not found: %s\n", dlerror());
    exit (EXIT_FAILURE);
 };
 // later, call initguiptr like
 (*initguiptr) ();

我不建议您详细了解C++ 名称修饰的工作原理,它的定义不是很好,而且细节取决于 C++ 库(尤其是标准 C++ 库)和编译器版本的特定版本。

于 2013-03-20T19:30:12.107 回答