c++ - 析构函数调用了不合适的库

标签 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;
 }

还有一个在 foo 中使用的 Logger 类,没什么有趣的,constructor(char * message),destructor() 和 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 有另一个具有相同对象名称的库。为什么为我的内部对象调用了一些外国库的析构函数?

最佳答案

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()

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

关于c++ - 析构函数调用了不合适的库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13414723/

相关文章:

c - 检查内核模块中的 '.read' 函数时出错

c++ - 无法使用来自单独 .cpp 的模板化成员编译/链接类

c++ - 为什么这个文件不能在 gcc 中编译?它在 VS 中运行良好

c++ - parallel_for - 要并行化哪个循环?

c++ - 使用匿名或 lambda 函数连接到 Boost Signals2 信号

c - 按发生顺序用不同进程写入同一个文件

linux - 如何使用 SED 解析 xml 同级元素值

c++ - 编译并运行CGAL Triangulation演示

c++ - 如果在运行时可用,是否自动使用 AVX/SSE?

c++ - 如何正确删除从另一个 DLL 接收的派生对象?