2

私の問題は次のとおりです。

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

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

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

nm -C -Dは、「IceStorm::NoSuchTopic」がInterface.soで未定義であることを示しています。これでいい?または、定義を見つけるための参照があるべきですか?私はすでにlibIceStorm.so(libs + = -lIceStorm)のエントリを追加しました。ここで、IceStorm :: NoSuchTopicが定義されています(nmによる)が、それは何も変更しません!

'-Wl、-E'も試しましたが、QtCreatorでこのオプションを正しく設定したかどうかわかりません。これはまったく役に立ちますか?

すべてのヒントに感謝します。

4

2 に答える 2

1

以前にこの問題が発生したことがある場合、通常は型情報が利用できないことが原因です。

try {} catch (...) {}型情報が欠落している場合でも例外をキャッチするため、ブロックを使用して例外をキャッチできることがよくありますが、特に有用ではありません!

これは、共有ライブラリでシンボルが非表示になっている場合に問題になることがよくあります。GCC の可視性の記事、特に「C++ 例外に関する問題 (お読みください!)」セクションを参照してください。

この質問では、追加のフラグを使用することをお勧めします。

ライブラリの古いバージョンに対して何かがビルドされている場合、クリーンリビルドによって問題が修正されることがあります。クリーン リビルドで問題が解決した場合は、ビルド スクリプトが正しいことを確認してください。

于 2012-01-18T13:17:32.207 に答える
0

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

于 2015-06-01T19:10:30.747 に答える