从特定库实例化对象时出现分段错误

时间:2009-12-07 09:56:07

标签: c++ linker segmentation-fault startup

我有一个C ++应用程序(大大缩短,如下所示);

#include <iostream>
#include "MyClass.h"

void foobar()
{
 MyClass a;
}

int main(int argc, char** argv)
{
 std::cout << "Hello world!\n";

 return 0;
}

其中“MyClass”在静态链接库(.a)中定义。

然而,这个应用程序Segfaults它的开始瞬间,我从未进入“Hello world”。

我可以从同一个库创建一个接口实例,但我无法创建实现该接口的类的实例。即;

void foobar()
{
 IMyClass a; // Having this in the application works.
 MyClass b;  // Segfault if this is in.
}

从上面可以看出,代码甚至不需要为应用程序调用段错误。

我正在使用Netbeans 6.7.1和GCC 4.3.2。

现在,我假设图书馆的链接有问题,但我不知道是什么。我也链接到其他库(所有静态链接)。上面的类来自第一个链接库(至少在列表中的第一个)。如果我从第二个列出的库创建一个类的实例,一切运行正常。

问题可能与我的其他问题类似(或相关):https://stackoverflow.com/questions/1844190/linking-with-apache-xml-security-causes-unresolved-references

有没有人对可能出现的问题有任何建议?

4 个答案:

答案 0 :(得分:3)

MyClass库中可能存在一些出错的静态初始化,如果您没有源代码,则很难找到并修复。

答案 1 :(得分:1)

如果您正在使用linux或OS X进行开发,可以通过在调试模式下编译并使用valgrind运行来获取有关此类错误的更多信息。

在调试模式下进行编译并不是绝对必要的,但可以提供更好的信息,说明出错的地方和位置。

我也在调试模式下编译包含MyClass的库。

要注意的另一件事是库使用相同的编译器标志进行编译,因为当静态对象具有不同的内部布局时,在两种编译器设置下会发生这种崩溃。 (在我的代码的一部分中使用-DREENTRANT编译应用程序的一部分时,我花了很长时间跟踪这个问题,而在另一部分代码中没有,第三方组件在这两种情况下最终使用不同的布局。)

答案 2 :(得分:0)

Stackoverflow。

MyClass可能很大,以适应堆栈。

答案 3 :(得分:0)

据我所知,从代码中可以看出foobar从未被调用过?只是声明它会导致段错误?

我可以想象,声明一个MyClass变量会导致一些模板实例化,这会实现一些静态初始化,但这会失败。比如,MyClass派生自SomeBase&lt;&gt;并且不可能在SomeBase&lt;&gt;内执行某些静态成员的初始化。当你删除MyClass变量的声明时,模板没有实例化,一切顺利......

class MyClass : public SomeBase<MyClass>{};

template<typename TYPE>
class SomeBase<TYPE> { static CauseASegfault* m_casf; };

// some bad m_casf initialization here...