我的问题如下:
有一个名为Interface.so的共享库,它基于ICE (互联网通信引擎),类似于频繁重复任务的包装器。其中一项任务是注册一个主题(类似于id)。如果这个主题还不存在,ICE会抛出一个名为NoSuchTopic的异常。
如果我在独立的Qt应用程序中使用Interface.so,则可以捕获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中正确设置了这个选项。这会有任何帮助吗?
我将非常感谢每一个提示。
发布于 2012-01-18 21:17:32
当我以前遇到过这个问题时,它通常是由于类型信息不可用。
您通常可以使用try {} catch (...) {}块捕获异常,因为即使缺少类型信息,它也可以捕获异常,但它并不是特别有用!
如果共享库有隐藏的符号,这通常是一个问题,请参阅GCC Visibility文章,特别是"Problems with C++ exceptions (请阅读!)“部分。
This question建议使用额外的标志。
有时,如果某些东西是针对旧版本的库构建的,则干净的重建可以修复问题。如果一个干净的重建解决了这个问题,请检查你的构建脚本是否正确。
发布于 2015-06-02 03:10:31
听起来像以前的版本在从源代码构建时使用了"no-exceptions“标志。它增加了大量的构建时间,所以很多人放弃了它。
https://stackoverflow.com/questions/8908567
复制相似问题