我有一个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
有没有人对可能出现的问题有任何建议?
答案 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...