Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ GCC程序中不会捕获异常_C++_Gcc_Exception Handling - Fatal编程技术网

C++ GCC程序中不会捕获异常

C++ GCC程序中不会捕获异常,c++,gcc,exception-handling,C++,Gcc,Exception Handling,我的项目包含共享库和exe客户端。我发现我自己从库中抛出的异常类并没有被客户机catch块捕获,程序终止时会显示“在抛出…的实例后终止调用”消息。继续玩这个项目,我发现任何类型的异常都不会被捕获。例如,此捕获不起作用: try { m_pSerialPort = new boost::asio::serial_port(m_IoService, "non-existing-port"); } catch(const boost::system::syste

我的项目包含共享库和exe客户端。我发现我自己从库中抛出的异常类并没有被客户机catch块捕获,程序终止时会显示“在抛出…的实例后终止调用”消息。继续玩这个项目,我发现任何类型的异常都不会被捕获。例如,此捕获不起作用:

try { m_pSerialPort = new boost::asio::serial_port(m_IoService, "non-existing-port"); } catch(const boost::system::system_error& e) { // ... } 尝试 { m_pSerialPort=新的boost::asio::串行端口(m_IoService,“不存在的端口”); } 捕获(常量boost::system::system_error&e) { // ... } 错误消息:

terminate called after throwing an instance of 'boost::exception_detail::clone_impl <boost::exception_detail::error_info_injector <boost::system::system_error> >' what(): No such file or directory 在抛出的实例后调用terminate 'boost::异常\详细信息::克隆\执行 ' what():没有这样的文件或目录 GCC版本是4.4.1,Linux操作系统。同样的代码在Windows、MSVC中成功运行。
什么原因可以阻止GCC程序正确捕获异常?

客户端.exe和共享库都应该与libgcc链接,以跨越共享库边界。根据GCC手册:

。。。如果库或主可执行文件应该抛出或捕获异常,则必须使用G++或GCJ驱动程序(适用于程序中使用的语言)链接它,或者使用-shared libgcc选项链接它,以便它与共享libgcc链接


您可以发布Makefile以便我们看到您传递给gcc的参数吗?您可以传递禁用异常的参数。附加信息:当我向客户机可执行文件添加以下代码时:try{throw 1;}catch(int){},一切正常。但共享库中的相同代码给出:terminate在抛出“int”编译器实例后调用:技术问题。我如何在这里发布Makefile?注释受长度限制,不允许任何格式设置。如果您在使用线程时看到此行为,请在此处检查我的类似问题:。这可能需要很长时间,但在共享库程序中将-static开关更改为-static libgcc之后,值得验证的是,它似乎正在工作。我不明白这种变化的副作用是什么。我的库是否仍然静态链接到第三方库?无论如何,这就是方向。只要阅读GCC手册中的这个地方:)我正在尝试静态链接第三方库,看起来我需要更好地了解这个问题。该程序正在运行,谢谢。您可以静态链接到第三方库,只需确保第三方库动态链接到libgcc即可。因此,您的流程中只有一个libgcc实例。