【问题标题】:C++ Exception not caught (Qt Project)未捕获 C++ 异常(Qt 项目)
【发布时间】:2012-01-18 10:28:07
【问题描述】:

我的问题如下:

有一个名为 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 中正确设置了此选项。这会有帮助吗?

我会很感激每一个提示。

【问题讨论】:

    标签: c++ qt exception shared-libraries ice


    【解决方案1】:

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

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

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

    This question 建议使用额外的标志。

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

    【讨论】:

    • 感谢您的回答。不幸的是,我在这里发布之前已经尝试了所有建议(我的“-Wl,-E”来自链接的答案)。但是,最后我的同事解决了这个问题。显然 Ubuntu 存储库中用于 ICE 的 GCC 版本与 Ubuntu 11.10 Default GCC 不同,因此通过从源代码重新编译 ICE 解决了问题...
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2016-11-11
      • 2020-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多