c++中共享c++库之间的异常

Exceptions between shared C++ libraries in g++

本文关键字:c++ 异常 之间 共享      更新时间:2023-10-16

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

我的问题是:

  1. 是便携的(MSVS)吗?
  2. 在哪些情况下,共享库A将无法处理来自共享库B的异常?我的意思是应用程序会崩溃;库A知道B可能出现的异常。
  3. 在我的例子中异常处理行为依赖于链接器吗?

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

但是,如果一个共享库可能被一个编译器编译(包括同一编译器的另一个版本),并且被另一个编译器编译的模块访问,那么您就有麻烦了:没有标准的二进制兼容性接口来处理异常。

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

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

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