我的问题如下:
有一个名为Interface.so的共享库,它基于ICE(Internet通信引擎),类似于频繁重复任务的包装器。其中一项任务是注册一个主题(类似于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表示在Interface.so中未定义'IceStorm :: NoSuchTopic'。这个可以吗?或者是否应该找到定义的参考?我已经添加了libIceStorm.so(libs + = -lIceStorm)的条目,其中定义了IceStorm :: NoSuchTopic(根据nm),但这并没有改变任何东西!
我也试过'-Wl,-E',但我不知道我是否在Qt Creator中正确设置了这个选项。这会有帮助吗?
我会很感激每一个提示。
答案 0 :(得分:1)
当我遇到此问题之前,通常是因为类型信息不可用。
您经常可以使用try {} catch (...) {}
块捕获异常,因为即使缺少类型信息也会捕获异常,但它不是特别有用!
如果共享库中隐藏了符号,这通常会出现问题,请参阅GCC Visibility文章,尤其是“C ++异常问题(请阅读!)”部分。
This question建议使用额外的标志。
如果针对旧版本的库构建了某些内容,有时清理重建会解决问题。如果clean-rebuild修复了问题,请检查构建脚本是否正确。
答案 1 :(得分:0)
听起来像以前的版本使用"无例外"从源头构建时的标志。它为构建增加了大量时间,因此很多人都将其关闭。