2017-10-13 448 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