2012-03-07 49 views
5

我想知道在什麼情況下使用Cygwin編譯C代碼,以及何時會選擇MinGW。我來到了描述Cygwin和MinGW之間差異的What is the difference between Cygwin and MinGW?何時使用Cygwin或MinGW編譯C代碼?

據我瞭解,我們可以說以下內容:

  • Cygwin的:允許編譯C源代碼POSIX兼容的操作系統,在Windows上運行(需要cygwin1.dll)。例如,我可以使用適用於Windows的pthreads API編譯應用程序,儘管Windows本身並未實現該API。
  • MinGW:允許編譯Windows兼容的C源代碼。因此,使用上面的示例,在MinGW中使用gcc進行編譯時,我無法使用pthreads API,但需要使用Windows提供的線程API。除了使用MinGW gcc編譯器外,我還可以使用不同的編譯器,例如VC++自帶的。

但是,我的理解似乎是錯誤的,因爲我能夠編譯一個包含pthread.h和MinGW的虛擬程序。我錯誤地理解了什麼?

回答

3

你的理解本質上是正確的。但是,有一個win32 pthreads端口,它是本地線程API的一個精簡包裝器。

更合適的例子是fork(),在win32上無法輕鬆模擬。爲此,Cygwin強制執行一個固定的DLL內存佈局,如果一個庫無法加載到應該去的地方(cue rebaseall),事情就會爆炸。

+0

所以我認爲這個win32 pthreads端口包含在MinGW中? – simon 2012-03-07 11:13:20

+0

@simon:它沒有用,但顯然它是自2010-02-18以來的MinGW基礎包(請參閱http://sourceforge.net/projects/mingw/files/MinGW/Base/pthreads-w32/) – Christoph 2012-03-07 11:33:04

+0

@Christoph Cygwin沒有強制執行固定的DLL內存佈局,但它確實需要能夠在與父級相同的地址處的分叉進程中加載​​DLL。 – ak2 2012-03-07 12:09:44