GCC 程序中没有捕获异常
Posted
技术标签:
【中文标题】GCC 程序中没有捕获异常【英文标题】:Exceptions are not caught in GCC program 【发布时间】:2010-03-11 12:28:02 【问题描述】:我的项目包含共享库和 exe 客户端。我发现我自己从库中抛出的异常类没有被客户端 catch 块捕获,并且程序以“抛出......的实例后调用终止”消息终止。继续玩这个项目,我发现任何类型的任何异常都没有被捕获。例如,这个 catch 不起作用:
尝试 m_pSerialPort = new boost::asio::serial_port(m_ioservice, "non-existing-port"); catch(const boost::system::system_error& e) // ...错误信息:
在抛出一个实例后调用终止 'boost::exception_detail::clone_impl <:exception_detail::error_info_injector> >' what():没有这样的文件或目录GCC 版本是 4.4.1,Linux 操作系统。相同的代码在 Windows、MSVC 中成功运行。 什么原因会阻止 GCC 程序正确捕获异常?
【问题讨论】:
能否请您发布 Makefile 以便我们查看您传递给 gcc 的参数?您可以传递禁用异常的参数。 附加信息:当我添加此代码时:尝试 throw 1;catch(int) 到客户端可执行文件,一切正常。但是共享库中的相同代码给出:在抛出'int'实例后调用终止 显眼编译器:技术问题。如何在此处发布 Makefile?评论受长度限制,不允许任何格式。 如果您在使用线程时看到此行为,请在此处查看我的类似问题:***.com/questions/1377833/…。可能是一个长镜头,但值得验证 在共享库程序中将 -static 开关更改为 -static-libgcc 后似乎可以正常工作。我不明白这种变化的副作用是什么。我的库是否仍静态链接到第三方库?不管怎样,这是方向。 【参考方案1】:客户端 .exe 和共享库都应该与 libgcc 链接,以便跨越共享库边界。根据 GCC 手册:
...如果一个库或主可执行文件应该抛出或捕获异常,您必须使用 G++ 或 GCJ 驱动程序链接它,根据程序中使用的语言,或使用选项 -shared-libgcc,这样它就与共享的 libgcc 链接。
【讨论】:
只是阅读 GCC 手册中的这个地方 :) 我正在尝试静态链接第三方库,看来我需要更好地了解这个问题。该程序正在运行,谢谢。 您可以静态链接到第三方库,只要确保第三方库动态链接到libgcc即可。因此,您的进程中将只有一个 libgcc 实例。以上是关于GCC 程序中没有捕获异常的主要内容,如果未能解决你的问题,请参考以下文章