2

我的问题如下:

有一个名为 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' 

nm -C -D 表示“IceStorm::NoSuchTopic”在 Interface.so 中未定义。这个可以吗?或者应该有一个参考在哪里可以找到定义?我已经添加了 libIceStorm.so (libs += -lIceStorm) 的条目,其中定义了 IceStorm::NoSuchTopic(根据 nm),但这并没有改变任何东西!

我也试过'-Wl,-E',但我不知道我是否在 Qt Creator 中正确设置了这个选项。这会有帮助吗?

我会很感激每一个提示。

4

2 回答 2

1

当我之前遇到这个问题时,通常是由于类型信息不可用。

您通常可以使用try {} catch (...) {}块捕获异常,因为即使缺少类型信息也会捕获异常,但这并不是特别有用!

如果共享库隐藏了符号,这通常是一个问题,请参阅GCC Visibility文章,尤其是“C++ 异常问题(请阅读!)”部分。

这个问题建议使用额外的标志。

如果某些东西是针对旧版本的库构建的,有时干净重建会解决问题。如果干净重建解决了问题,请检查您的构建脚本是否正确。

于 2012-01-18T13:17:32.207 回答
0

听起来以前的版本在从源代码构建时使用了“无异常”标志。它为构建增加了很多时间,所以很多人都放弃了它。

于 2015-06-01T19:10:30.747 回答