2017-10-13 419 views
1

库需要这些DLL:Mingw-w64,libgcc_s_seh.dll的用途是什么?使用MinGW-W64内置

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

我不知道这是怎么回事就这样,每个DLL做什么?尤其是libgcc_s_seh,是那种结构化的异常处理?我以为明明不能和佘合作。

为什么mingw需要始终将这些DLL与您的exe文件?

我不知道我是不是在浪费我的时间,不只是使用visual studio作为Windows编译器。它很臃肿,但9GB的安装。

回答

0

尤其是libgcc_s_seh,是那种结构化的异常处理?我以为明明不能和佘合作。

较新版本的GCC(4.8+,如果我没错的话)应该支持MinGW上的SEH。

我想知道这是怎么回事,每个DLL都做了什么?

它们提供运行时和标准库。

  • libwinpthread:Windows上的并行线程执行(穿线)
  • 的libstdC++:C++标准库(C/C++库函数等)
  • libgcc_s_seh:异常处理(SEH)

为什么mingw需要始终将这些dll与您的exe文件?

因为您的程序使用它们。如果你编写的程序没有线程,标准库和异常以及任何操作系统交互,你不需要它们。

这些DLL带来了运行程序所需的一切。顺便说一句。这是而不是 MinGW唯一的事情,也发生在其他系统/编译器上。通常你不会注意到这一点,因为操作系统已经提供了库,例如。 MSVC库很可能在Windows机器上。 动态链接总是需要某种类型的库文件,即Windows上的.dll和Linux上的.so

如果您已在系统上使用它,请使用ldd <your application>来查看哪些库是动态链接的。

您可以将这些MinGW库安装到系统库或操作系统可以找到的地方。这使您的程序能够使用它,并且不再需要随每个应用程序一起发货(避免重复)。

另一方面,另一个选项是静态链接它们。不像动态连接,你不需要任何DLL;不利的一面是增加了你的应用程序的大小(因为现在这三个库已经被加入exe了)。

我不知道我是不是在浪费我的时间,而不仅仅是使用visual studio作为Windows编译器。

这取决于你的情况。但是,我的答案可能会给你更多的见解。

+0

从技术上讲,应该可以直接使用kernel32.dll和user32.dll进行线程和seh。我想知道为什么mingw不够聪明。感觉如此浪费。我可以在这些DLL上获得一些链接,了解它们的工作方式?也许是源代码? –

+0

不,因为MinGW使用POSIX线程(PThreads)和GCC异常模型,而不是Windows的;另一方面,Windows不支持这些。这就是为什么你不能使用这两个Windows DLL的原因。 MinGW在Windows上提供了GNU系统,因此它遵循GNU/POSIX实现。 – ollo

+0

您可以在[mingw-w64网站](http://mingw-w64.org/doku.php/start)上找到源代码。我认为大多数(如果不是全部的话)代码可以通过他们的[repository](https://sourceforge.net/p/mingw-w64/mingw-w64/ci/master/tree/)获得。也许你可以找到更多有关上游[GNU GCC网站](https://gcc.gnu.org/)的信息。 – ollo