g ++中共享C ++库之间的异常

时间:2011-07-28 05:01:55

标签: c++ linux exception g++ shared-libraries

据我所知,在C ++ STD中没有定义(未定义的行为),当一个共享库在另一个共享库中引发异常时,编译后的应用程序应如何处理这种情况[共享库]。 G ++ / Linux生成的代码表明可以在共享库之间引发异常。

我的问题是:

  1. 便携式(MSVS)?
  2. 在哪种情况下,共享库A将无法处理共享库B中的异常? [我的意思是申请会崩溃;图书馆A知道B]可能存在的例外情况。
  3. 我的示例中的异常处理行为是否依赖于链接器?

2 个答案:

答案 0 :(得分:3)

这实际上取决于您对共享库的使用。如果您将它们用作同一应用程序/系统中的物理模块并使用相同的编译器进行编译,那么您应该没问题(只要您还动态链接到C ++标准库)。

但是,如果共享库有可能用一个编译器(包括同一编译器的另一个版本)编译并由另一个编译的模块访问,那么你就麻烦了:没有标准的二进制兼容性接口例外。

答案 1 :(得分:2)

这似乎是编译器相关的问题。我在部署到Windows时遇到了问题,其中必须使用共享libstdc ++构建MinGW-GCC以启用跨DLL异常处理(这对于Debian版本来说是非默认的并且需要我重新编译GCC )。

因此我假设编译器之间没有共同的ABI,因为GCC在所有方面都不符合自身。关于技术方面的考虑,需要将低级异常处理信息存储在某处,而这可能是第三个库C,它确实处理异常。编译器可能能够共享这个库,但我认为它们不是。

好的一面:我目前正在为POSIX系统和Windows交叉编译一个相当大的项目,并在多线程环境中大量使用跨库异常。它适用于GCC的共享libstdc ++,并且由于所有组件都是开源的,因此我可以轻松地重新编译MinGW的所有C ++依赖项。