【发布时间】:2017-06-28 19:31:21
【问题描述】:
我正在用 C++ 编写一个 Windows DLL。这个库只有 C 接口,并且只使用也有 C 接口的标准 Windows 库。因此,将所有 C++ 库静态链接到库中似乎是安全的,因为仅使用 C 接口时我不依赖于 C++ ABI 版本。
不幸的是,当我使用 -static-stdc++ -static-libgcc 编译我的库时,我的库停止处理异常,当抛出一些异常时,DLL 调用其静态链接的 _Unwind_RaiseException 函数,这会中止整个应用程序。
我认为它可能是一个损坏的libgtcc.a,所以我尝试更新我的编译器。但是 MinGW 4.8 和 MinGW 6.3 的结果是一样的。
请问有人能解释一下这里到底发生了什么吗?
Klasyc
【问题讨论】:
-
使用 TDM-GCC。看简要说明here
-
或者支持SEH的MinGW。
-
@RustyX OP 已经尝试过 MinGW,正如你所说,它支持 SEH,但如果库是静态链接的并且异常被抛出跨 DLL 边界,则不支持。这是 TDM-GCC 解决的问题之一。如果运行时库是动态链接的(即进程中只有一个版本),MinGW 就很好。
-
@RustyX:为什么我需要支持 SEH 的编译器?我认为 SEH 允许我捕获 Windows 异常,例如访问冲突等,但即使是基本的 C++ 异常,我也有问题。
-
@Dan:我通常使用 QtCreator 和 MinGW 随附的 C++/Qt。我对这个组合很满意。因此,我也将它用于我的 DLL。
标签: c++ windows dll exception-handling