4

私のプロジェクトは次のもので構成されています。

  • 大部分が C++11 で書かれた私のプログラム (C++03 モードでコンパイルしようとするのは実際的ではありません)
  • 同じコンパイラでコンパイルされた共有ライブラリ ( https://github.com/SOCI/soci )

SOCI は、コードでキャッチする必要がある例外をスローします。以前は GCC4.7.3 で動作していましたが、GCC4.8.1 に移行したため、動作しなくなりました: 例外はすべてのハンドラー (を含むcatch(...)) を通過し、終了を引き起こします:

terminate called after throwing an instance of 'soci::mysql_soci_error'
  what():  Table 'brphrprhprh' doesn't exist
The program has unexpectedly finished.

私が試したこと:

  • 私のコードから同じ例外をスローします (問題点の近く): 正しいハンドラーでキャッチされます。
  • SOCI を再コンパイル-std=c++11: 違いなし
  • __attribute__((visibility("default")))例外クラスへの追加: 違いなし
  • -related シンボルの-uオプションをいじる: 動作に違いはなく、シンボルは出力で未定義として表示されます。がなければ、まったくないことに注意してください。typeinfonm-u

    $ nm -D -C myprogram | grep soci | grep error
                     U soci::soci_error::soci_error(std::string const&)
    000000000044013a W soci::soci_error::~soci_error()
    0000000000440124 W soci::soci_error::~soci_error()
    0000000000440124 W soci::soci_error::~soci_error()
    00000000004c43b0 V typeinfo for soci::soci_error
                     U typeinfo for soci::mysql_soci_error
    00000000004c43d0 V typeinfo name for soci::soci_error
                     U typeinfo name for soci::mysql_soci_error
    00000000004c60c0 V vtable for soci::soci_error
                     U vtable for soci::mysql_soci_error
    

http://gcc.gnu.org/wiki/Visibilityも読みましたが、他に何か欠けているに違いありません..

何かアドバイス?


編集

実際、それは動的ライブラリの問題ではありませんでした。私はすぐにそれを静的にコンパイルしようとするべきでした-そして、動作が実際には変わらないので、多くの時間を節約できました. (答えを見てください)

4

1 に答える 1

4

最後に、私は問題を理解しました... D'oh。

例外が捕捉されなかったわけではありません。への呼び出しstd::terminateは、例外がデストラクタからスローされたときに行われました。これは、C++11 ではデフォルトで許可されていません。私が実際に直面した問題は次のとおりでした:デストラクタと noexcept -- コンパイラのバグにより、ライブラリのバグに気付かないままでした...

于 2013-09-13T13:52:31.507 に答える