我有一个带有void initGui()函数的文件。它的东西。
我也有一个用该文件制作的.so共享库。

问题是,当我尝试启动dlsym(..., "initGui")时,dlerror()告诉我它没有找到该符号(当然,我用dlopen打开了它)。因此,我尝试对共享库进行nm。我“理解”了_Z7initGuiiii可能就是我想要的。因此,我尝试对其进行dlsym编码。

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

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

最佳答案

在某些用C++编码的经过dlsym编码的共享库中进行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++ name mangling works的定义,它的定义不是很好,并且细节取决于C++库的特定版本(尤其是标准C++库)和编译器版本。

09-30 15:43