2012-01-18 37 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

从源代码构建时,与以前版本类似的声音使用“无例外”标志。它增加了很多时间,所以很多人都离开了它。