2012-03-07 13 views
5

Zastanawiam się, w jakich sytuacjach używa się Cygwin do kompilowania kodu C i kiedy ktoś wybrałby MinGW. Natknąłem się na What is the difference between Cygwin and MinGW?, opisując różnice między Cygwin i MinGW.Kiedy używać Cygwin lub MinGW do kompilowania kodu C?

O ile zrozumiałem, można by powiedzieć, co następuje:

  • Cygwin: Umożliwia kompilację kodu źródłowego C dla systemów operacyjnych zgodnych z POSIX, aby uruchomić w systemie Windows (wymaga cygwin1.dll). Na przykład mogę skompilować aplikację przy użyciu API pthreads dla Windows, chociaż sam system Windows nie implementuje interfejsu API.
  • MinGW: Umożliwia kompilację kodu źródłowego zgodnego z systemem Windows. Używając powyższego przykładu, nie mogłem używać API pthreads podczas kompilacji z gcc w MinGW, ale wymagałoby to użycia API wątków oferowanego przez Windows. Zamiast używać kompilatora GCc MinGW, mógłbym również używać innego kompilatora, np. ten, który pochodzi z VC++.

Jednak moje zrozumienie wydaje się błędne, ponieważ udało mi się skompilować program fikcyjny zawierający pthread.h z MinGW. Co rozumiem źle?

Odpowiedz

3

Twoje zrozumienie jest zasadniczo poprawne. Istnieje jednak port pthreads win32, który jest cienkim opakowaniem w API natywnego wątku.

Bardziej odpowiednim przykładem będzie fork(), którego nie da się łatwo emulować na win32. Aby to zrobić, Cygwin wymusza ustalony układ pamięci DLL, a rzeczy będą eksplodować, jeśli biblioteka nie może być załadowana tam, gdzie powinna się znaleźć (cue rebaseall).

+0

Zakładam więc, że ten port win3 pthreads znajduje się w MinGW? – simon

+0

@imon: nie było, ale najwyraźniej jest to pakiet podstawowy MinGW od 2010-02-18 (patrz http://sourceforge.net/projects/mingw/files/MinGW/Base/pthreads-w32/) – Christoph

+0

@Christoph Cygwin nie wymusza stałego układu pamięci DLL jako takiego, ale musi być w stanie załadować biblioteki DLL w procesie rozwidlania pod tymi samymi adresami, co element nadrzędny. – ak2

Powiązane problemy