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)で定義されています。

ただし、このアプリケーションは起動した瞬間にSegfaultが発生し、「Helloworld」に到達することはありません。

同じライブラリからインターフェイスのインスタンスを作成することはできますが、インターフェイスを実装するクラスのインスタンスを作成することはできません。つまり、

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

上からわかるように、アプリケーションがセグメンテーション違反を起こすためにコードを呼び出す必要はありません。

Netbeans6.7.1とGCC4.3.2を使用しています。

さて、ライブラリのリンクに何か問題があると思いますが、何がわかりません。他のライブラリ(すべて静的にリンクされている)にもリンクしています。上記のクラスは、最初にリンクされたライブラリからのものです(少なくともリストの最初)。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またはOSXで開発している場合は、デバッグモードでコンパイルし、valgrindを使用して実行することで、この種のエラーに関するより多くの情報を得ることができます。

デバッグモードでコンパイルする必要はありませんが、何がどこで問題になっているのかについて、はるかに優れた情報が得られます。

MyClassを含むライブラリもデバッグモードでコンパイルします。

もう1つ注意すべき点は、ライブラリが同じコンパイラフラグでコンパイルされていることです。この種のクラッシュは、2つのコンパイラ設定で静的オブジェクトの内部レイアウトが異なる場合に発生する可能性があるためです。(コードの一部で-DREENTRANTを使用してアプリケーションの一部をコンパイルし、別の部分ではコンパイルしない場合、これを追跡するのに長い時間を費やしました。サードパーティのコンポーネントは、2つのケースで異なるレイアウトになりました。)

于 2009-12-07T10:22:03.833 に答える
0

Stackoverflow。

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 に答える