2012-01-18 39 views
2

我的問題是這樣的:C++異常

有一個叫Interface.so共享庫,它是基於ICE(互聯網通信引擎)和類似的經常重複的任務的包裝。其中一項任務是註冊一個主題(類似於一個id)。如果該主題不存在,則ICE將引發一個名爲NoSuchTopic的異常。

如果我將Interface.so與獨立的Qt應用程序一起使用,可以捕獲NoSuchTopic異常並在catch塊中創建主題(catch塊駐留在Interface.so中)。 但是我想在一個飛行模擬器的插件中做同樣的事情,這個模擬器本身就是一個共享對象 - 這裏的異常並沒有被前面提到的Interface.so中的catch塊捕獲。 相反,飛行模擬器崩潰,說明

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

納米-C -D說, '冰雪風暴:: NoSuchTopic' 在Interface.so不確定。這個可以嗎?或者應該有一個參考在哪裏找到定義?我已經添加了libIceStorm.so(libs + = -lIsStorm)的條目,其中IceStorm :: NoSuchTopic被定義(根據nm),但不會改變任何東西!

我也試過'-Wl,-E'但我不知道是否在Qt Creator中正確設置了這個選項。這會有所幫助嗎?

我會感激每一個提示。

回答

1

當我遇到這個問題之前,通常是由於類型信息不可用。

您通常可以通過try {} catch (...) {}塊捕獲異常,因爲即使類型信息丟失,也可以捕獲異常,但它並不特別有用!

如果共享庫中隱藏了符號,這通常是一個問題,請參閱GCC Visibility文章,特別是「C++異常問題(請閱讀!」)一節。

This question建議使用額外的標誌。

有時候,如果對庫的舊版本構建了某種東西,乾淨重建會修復這些問題。如果幹淨重建修復了問題,請檢查您的構建腳本是否正確。

+0

感謝您的回答。不幸的是,我在發佈之前嘗試了所有建議(我的「-Wl,-E」來自鏈接的答案)。但是,最後我的同事解決了這個問題。顯然,Ubuntu儲存庫中用於ICE的GCC版本與Ubuntu 11.10默認GCC不同,因此通過從源代碼重新編譯ICE解決了該問題。 – Markus 2012-01-18 20:58:45

0

從源代碼構建時,與以前版本類似的聲音使用「無例外」標誌。它增加了很多時間,所以很多人都離開了它。