c++中共享c++库之间的异常
Exceptions between shared C++ libraries in g++
据我所知,在c++ STD中没有定义(未定义的行为),当一个共享库在另一个[共享库]中引发异常时,编译的应用程序应该如何处理。c++/Linux生成的代码表明,在共享库之间引发异常是可能的。
我的问题是:
- 是便携的(MSVS)吗?
- 在哪些情况下,共享库
A
将无法处理来自共享库B
的异常?我的意思是应用程序会崩溃;库A
知道B
可能出现的异常。 在我的例子中异常处理行为依赖于链接器吗?
这实际上取决于您使用的共享库。如果你在同一个应用程序/系统中使用它们作为物理模块,并使用相同的编译器编译它们,你应该没问题(只要你还动态链接到c++标准库)。
但是,如果一个共享库可能被一个编译器编译(包括同一编译器的另一个版本),并且被另一个编译器编译的模块访问,那么您就有麻烦了:没有标准的二进制兼容性接口来处理异常。
这似乎是一个编译器相关的问题。我在部署到Windows时遇到了问题,其中MinGW-GCC必须使用共享的libstdc++构建以启用跨dll异常处理(这对于Debian版本是非默认的,需要我重新编译GCC)。
因此,我假设编译器之间没有通用的ABI,因为GCC甚至在所有方面都不符合自身。从技术上考虑,低级异常处理信息需要存储在某个地方,而这个地方很可能是第三个库C,它确实处理异常。编译器可能能够共享这个库,但我认为它们不能。
好的一面是:我目前正在为POSIX系统和Windows交叉编译一个相当大的项目,并且在多线程环境中大量使用跨库异常。它与GCC的共享libstdc++一起工作,由于所有组件都是开源的,因此我可以简单地重新编译MinGW的所有c++依赖项。
相关文章:
- 处理多个异常集合的C++方法
- 我在c++代码中生成了一个运行时#3异常
- 孤立代码块在结构中引发异常
- C++中的赋值发生,尽管右侧出现异常
- 从构造函数抛出异常时如何克服内存泄漏
- 异常属于C++中的线程还是进程
- 当类定义不可见时捕获异常
- 引发异常:读取访问冲突**dynamicArray**为0x1118235.发生
- 为什么异常不退出程序?
- 为什么我应该在异常处理中使用std::cerr而不是std::cout
- 如何修复链表类实现的未处理异常0xDDDDDDDD
- 关于:C++中异常对象的范围:为什么我没有得到副本?
- 是什么导致了Unity 3D中的"错误线程异常"?
- 如何将strftime中的格式错误作为异常捕获
- 创建具有 new in 函数和"this is nullptr"异常的对象
- 尝试使用智能指针时引发异常
- 函数如何通知用户它基于函数原型抛出异常?
- 是否值得降低我的代码的可读性,以便在出现内存不足错误时提供异常安全性?
- 当我使用 C++ 中的 C# dll 来使用 Selenium 时,存在异常处理问题
- Pytorch torch.cholesky忽略异常