我有一个带有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++库)和编译器版本。