析构函数称为表单不合适的库

时间:2012-11-16 10:27:07

标签: c++ linux g++ siebel

以下是代码:

foo.h

extern "C" {
    int  sdq_init_connector(const SSchar* path);
}

foo.cxx

int sdq_init_connector(const SSchar* path)
{
    Logger log(LOG_DEBUG, "sdq_init_connector");

    /*
    here goes some not so relevant code
    */

    log.write("Here be dragons");

    return 0;
 }

还有Logger类,它在foo中使用,没有什么有趣的,构造函数(char * message),析构函数()和write(char * message)。

问题摘要:

当我从测试设备调用libfoo.so时,它可以完美地工作,但是当在函数sdq_init_connector返回后从生产系统调用它时,它返回SEGFAULTs回溯

#10 <signal handler called>
#11 0x583d7fee in Node::~Node() () from /opt/siebel/sba81/siebsrvr/mw/lib/libtl.so
#12 0x583de09a in Logger::~Logger() () from /opt/siebel/sba81/siebsrvr/mw/lib/libtl.so
#13 0x6c86e001 in sdq_init_connector () from /opt/siebel/sba81/siebsrvr/lib/libfoo.so

注意#12有另一个具有相同对象名称的库。为什么来自某个外部库的析构函数需要我的内部对象?

1 个答案:

答案 0 :(得分:1)

Logger对象的析构函数的签名确实相同。

它是怎么回事:

[root@baz ~]# nm -aC /opt/siebel/sba81/siebsrvr/mw/lib/libtl.so| grep Logger
0001a0b0 W Logger::~Logger()
0001a070 W Logger::~Logger()

[root@baz ~]# nm -aC /opt/siebel/sba81/siebsrvr/lib/libfoo.so| grep Logger
000251b8 T Logger::~Logger()
000257ac T Logger::~Logger()
00025d90 T Logger::~Logger()

现在怎么样:

[root@baz ~]# nm -aC /opt/siebel/sba81/siebsrvr/lib/libfoo.so| grep Logger
00025288 T Foo::Logger::~Logger()
0002587c T Foo::Logger::~Logger()
00025e60 T Foo::Logger::~Logger()

我已经为我的库添加了命名空间,它解决了这个问题。