Mingw-w64,libgcc_s_seh.dll的目的是什么?

9

使用Mingw-w64构建的库需要这些dll:

libwinpthread-1.dll
libstdc++-6.dll
libgcc_s_seh-1.dll

我想知道这些dll是做什么用的,特别是libgcc_s_seh,它是结构化异常处理吗?我以为mingw不能与seh一起使用。

为什么mingw要求始终将这些dll与exe一起使用?

我在想,如果不使用visual studio作为Windows编译器,我是否只是在浪费时间。但它太臃肿了,需要9GB的安装空间。


您可以通过使用静态链接构建自包含的可执行文件(即,您不需要传输这些 DLL 文件)。它默认为 DLL 模式,可能是为了在存在多个可执行文件的情况下节省磁盘空间。 - M.M
1个回答

8
特别是libgcc_s_seh,是结构化异常处理吗?我以为mingw不能与seh一起使用。
新版本的GCC(如果我没记错是4.8+)应该支持在MinGW上使用SEH。
我想知道这些dll是做什么用的?
它们提供运行时和标准库。
- libwinpthread:Windows上的PThreads实现(线程) - libstdc++:C ++标准库(C / C ++库函数等) - libgcc_s_seh:异常处理(SEH)
为什么mingw需要始终将这些dll与您的exe一起使用?
因为您的程序使用它们。如果您编写一个没有线程、标准库、例外和任何操作系统交互的程序,则不需要它们。
这些DLL带来了运行程序所需的一切。顺便说一句,这不仅适用于MinGW,其他系统/编译器也会发生这种情况。通常您只需要注意到这一点,因为操作系统已经安装了库,例如,在Windows机器上非常有可能存在MSVC库。动态链接始终需要某种类型的库文件,在Windows上是.dll,在Linux上是.so。
如果您在系统上安装了它,请使用ldd <your application>查看动态链接的库。您可以将这些MinGW库安装到系统库中或某个操作系统可以找到的位置。这使您的程序可以使用它,您不再需要在每个应用程序中使用它(避免了重复)。
另一方面,另一个选项是将它们静态链接。与动态链接不同,您不需要任何DLL;缺点是增加了应用程序的大小(因为现在三个库都被烘焙到exe中)。
我想知道如果不使用Visual Studio作为Windows编译器是否只是浪费时间。
这取决于您的情况。但是可能我的答案会给您更多的见解。

从技术上讲,直接使用kernel32.dll和user32.dll进行线程和seh操作应该是可行的。我想知道为什么mingw不够聪明以做到这一点。感觉很浪费。我能否获得有关这些dll的链接,以及它们如何工作的信息?也许还有源代码? - puppon -su
1
不行,因为MinGW使用POSIX线程(PThreads)和GCC异常模型,而不是Windows的;另一方面,Windows不支持这些。这就是为什么你不能使用那两个Windows DLL的原因。MinGW在Windows上提供了一个GNU系统,因此它遵循GNU / POSIX实现。 - ollo
你可以在 mingw-w64 网站 上找到源代码。我认为他们的 代码库 中提供了大部分(如果不是全部)的代码。也许你可以在上游的 GNU GCC 网站 上找到更多信息。 - ollo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接