私のプロジェクトは次のもので構成されています。
- 大部分が 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
オプションをいじる: 動作に違いはなく、シンボルは出力で未定義として表示されます。がなければ、まったくないことに注意してください。typeinfo
nm
-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も読みましたが、他に何か欠けているに違いありません..
何かアドバイス?
編集
実際、それは動的ライブラリの問題ではありませんでした。私はすぐにそれを静的にコンパイルしようとするべきでした-そして、動作が実際には変わらないので、多くの時間を節約できました. (答えを見てください)