2013-03-20 62 views
2

我有一个文件,里面有void initGui()函数。它做的东西。 我也有一个.so共享库与该文件。链接共享库时出现奇怪的符号g ++

问题是,当我尝试启动一个dlsym(..., "initGui")时,dlerror()告诉我它没有找到符号(当然,我用dlopen打开它)。所以我试图nm我的共享库。我“明白”_Z7initGuiiii可能是我正在寻找的。所以我试图dlsym它...它的工作。

请有人告诉我如何在我的共享对象库中有干净的符号?我编了g++ -Wall -Wextra -Werror -c -fPIC

+0

这是C++的名称mangling。但是我不知道你的问题的答案。这是一个很好的问题。 – nalply 2013-03-20 19:26:36

+1

也许这将帮助你:http://www.isotton.com/devel/docs/C++-dlopen-mini-HOWTO/C++-dlopen-mini-HOWTO.html – nalply 2013-03-20 19:28:17

回答

3

通常的实践中,当dlsym -ing里面一些dlopen -Ed共享库在C++中的编码是有那些seeked符号(那些你是对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++库)和编译器版本。

+0

谢谢大家的答案! – 2013-03-21 10:56:34