2012-01-18 8 views
2

私の問題は、以下の通りである。キャッチされないC++例外(Qtのプロジェクト)

ICE(インターネット通信エンジン)と頻繁に定期的なタスクのためのラッパーのようなものに基づいていますInterface.soと呼ばれる共有ライブラリがあります。これらのタスクの1つは、トピックに登録することです(idに似ています)。このトピックが既に存在しない場合、ICEはNoSuchTopicという例外をスローします。

スタンドアロンのQtアプリケーションでInterface.soを使用すると、NoSuchTopic例外をキャッチしてキャッチブロック(キャッチブロックがInterface.soにある)にトピックを作成することができます。 しかし、私は共有オブジェクト自体であるフライトシミュレータ用のプラグインで同じことをやってみたい - と、ここで例外がInterface.soで以前に述べたcatchブロックでキャッチされていません。 は代わりに、フライトシミュレータは

terminate called after throwing an instance of 'IceStorm::NoSuchTopic' 

nmの-C -Dは、 'アイス・ストーム:: NoSuchTopicは' Interface.soに定義されていないと述べている旨クラッシュします。これでいい?あるいは定義を見つけるための参照があるべきか? IceStorm :: NoSuchTopicが定義されている(nmによる)libIceStorm.so(libs + = -lIceStorm)のエントリを既に追加しましたが、それでも何も変わりません!

私も「-Wl、-E」を試してみましたが、私はQtのCreatorで正しくこのオプションを設定した場合、私は知りません。これはまったく役に立ちますか?

私はすべてのヒントのために感謝されます。通常、利用可能ではない情報を入力することになっている前に、私はこの問題を持っていた

答えて

1

try {} catch (...) {}ブロックで例外をキャッチすることができます。タイプ情報がない場合でも例外をキャッチしますが、それは特に有用ではありません。

これは共有ライブラリにシンボルが隠されていると問題になることがよくあります。GCC Visibilityの記事、特に「C++例外の問題(お読みください!)」を参照してください。

This questionは、余分なフラグの使用を推奨しています。何かが、ライブラリの古いバージョンに対して構築されている場合

時々クリーン再構築は、物事を修正します。クリーンリビルドで問題が解決された場合は、ビルドスクリプトが正しいことを確認してください。

+0

あなたの答えをありがとう。残念ながら私はここに投稿する前にすべての提案を試みました(私の "-Wl、-E"はリンクされた答えから来た)。しかし、ついに私の同僚は問題を解決しました。どうやら、UbuntuリポジトリのICEに使われているGCCのバージョンはUbuntu 11.10のデフォルトのGCCと違うので、問題はICEをソースから再コンパイルすることで解決しました... – Markus

0

以前のバージョンのような音は、ソースからビルドするときに「例外なし」フラグを使用しました。それはビルドに多くの時間を追加するので、多くの人がそれを離れる。

関連する問題