0

我有一个 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”。

我可以从同一个库中创建一个接口的实例,但我不能创建一个实现该接口的类的实例。IE;

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

4 回答 4

3

库内部可能有一些静态初始化MyClass出错,如果您没有源代码,将很难找到和修复。

于 2009-12-07T10:04:21.467 回答
2

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

在调试模式下编译并不是绝对必要的,但会提供更好的信息来说明哪里出了问题以及在哪里。

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

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

于 2009-12-07T10:22:03.833 回答
0

一个堆栈溢出。

MyClass 可能太大而无法放入堆栈。

于 2009-12-07T10:00:41.127 回答
0

据我从代码中了解, foobar 永远不会被调用?只是声明它会导致段错误?

我可以想象,声明一个 MyClass 变量会导致一些模板实例化,它实现了一些静态初始化,但失败了。比如说,MyClass 是从 SomeBase<> 派生的,不可能在 SomeBase<> 中执行一些静态成员的初始化。当您删除 MyClass 变量的声明时,模板不会被实例化并且一切顺利......

class MyClass : public SomeBase<MyClass>{};

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

// some bad m_casf initialization here...
于 2009-12-07T10:24:26.027 回答