尤其是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編譯器。
這取決於你的情況。但是,我的答案可能會給你更多的見解。
從技術上講,應該可以直接使用kernel32.dll和user32.dll進行線程和seh。我想知道爲什麼mingw不夠聰明。感覺如此浪費。我可以在這些DLL上獲得一些鏈接,瞭解它們的工作方式?也許是源代碼? –
不,因爲MinGW使用POSIX線程(PThreads)和GCC異常模型,而不是Windows的;另一方面,Windows不支持這些。這就是爲什麼你不能使用這兩個Windows DLL的原因。 MinGW在Windows上提供了GNU系統,因此它遵循GNU/POSIX實現。 – ollo
您可以在[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