gpt4 book ai didi

c++ - Windows DLL 上的静态链接 libgcc

转载 作者:行者123 更新时间:2023-12-02 10:08:43 34 4
gpt4 key购买 nike

我正在用 C++ 编写一个 Windows DLL。这个库只有 C 接口(interface),并且只使用也有 C 接口(interface)的标准 Windows 库。因此,将所有 C++ 库静态链接到库中似乎是安全的,因为仅在使用 C 接口(interface)时我不依赖于 C++ ABI 版本。

不幸的是,当我用 -static-stdc++ -static-libgcc 编译我的库时,我的库停止处理异常,当抛出一些异常时,DLL 调用它的静态链接 _Unwind_RaiseException中止整个应用程序的函数。

我认为它可能是损坏的 libgtcc.a所以我试图更新我的编译器。但结果与 MinGW 4.8 和 MinGW 6.3 相同。

请问有人能解释一下这里到底发生了什么吗?

克拉西克

最佳答案

您是否正在处理 DLL 中的所有异常?如果任何异常“泄漏”到具有 C 调用约定的函数之外,它将使应用程序崩溃。

我在 MinGW x86_64-5.3.0-win32-seh-rt_v4-rev0 mingw32 4.8.1 dwarf2 下使用静态 libstdc++/libgcc 的 C++ 异常没有问题。

DLL 源(dll.cpp):

#include <windows.h>
#include <exception>
#include <iostream>

extern "C" {
__declspec(dllexport) int __stdcall test() {
try {
new int[-1];
return 123;
} catch (const std::exception& ex) {
std::cerr << "Exception:" << ex.what() << std::endl;
return 456;
}
}
}

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
return TRUE;
}

应用程序源( app.c):
#include <stdio.h>

#ifdef __cplusplus
extern "C"
#endif
__declspec(dllimport) int __stdcall test();

int main() {
printf("result: %d\n", test());
return 0;
}

编译它:
g++ -O2 -static-libgcc -static-libstdc++ -shared -Wl,--out-implib=dtest.lib -s -o dtest.dll dll.cpp g++ -O2 -static-libgcc -static-libstdc++ -L. -s -o app app.c -ldtest
输出:

Exception:std::bad_alloc
result: 456

要回答您的评论“为什么我需要支持 SEH 的编译器?我认为 SEH 允许我捕获 Windows 异常”——在 Windows 上,SEH 是所有异常的事实上的标准,包括 C++ 异常(使用 Visual C++ 编译时)。 MinGW 对 C++ 异常(SEH、SJLJ 和 DWARF)有不同的实现,但是 SEH 是唯一零开销的机制,所以如果它可用,你真的应该更喜欢它而不是 SJLJ 和 DWARF。

关于c++ - Windows DLL 上的静态链接 libgcc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42159583/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com