2013-04-29 15 views
15

Próbowałem zrozumieć, czym dokładnie są Cygwin i MinGW, i uznają to za bardzo zagmatwane. Jeśli chcesz programować w C++, czy nie potrzebujesz tylko kompilatora C++? Z tego co przeczytałem wydaje się, że starają się zapewnić system operacyjny typu Unix w systemie Windows, ale nie widzę znaczenia tego. Chodzi mi o to jest jakiś powód, że C++ nie może natywnie być skompilowany w systemie Windows? Czytałem również, że zawierają biblioteki, czy to dlatego, że język rdzeniowy C++ nie obsługuje wielu funkcji, więc pojawiają się w nim bardzo popularne biblioteki, takie jak math.h?Dlaczego potrzebne są Cygwin i MinGW?

+0

Nie potrzebujesz ich do kompilacji C++ w systemie Windows. Po prostu dostarczają ci GCC. – Blender

+0

@Blender, więc mówisz, że pozwalają na uruchamianie GCC w Oknie i skoro GCC jest tak popularny, to jest to pożądane? – Celeritas

+2

GCC to tylko jeden z wielu kompilatorów C/C++. – Blender

Odpowiedz

8

To wyjaśnienie jest zobowiązany być już zapisane w innym miejscu, ale tu idzie tak ...

Cygwin jest kompatybilny Runtime POSIX zbudowany na Win32 API. Zapewnia w dużej mierze zgodną bibliotekę POSIX C, a dookoła tego jest coś w rodzaju "Cygwin Distro" z menedżerem pakietów, który pozwala zainstalować mnóstwo programów uniksowych, które są uruchamiane pod Cygwin. Należą do nich powłoka Uniksa, GCC (dla Cygwin), X, kilka kompilatorów krzyżowych itp.

MinGW (-w64) to projekty zapewniające bezpłatne nagłówki i biblioteki Win32 (takie jak w domenie publicznej). Możesz to zobaczyć jako darmowy zamiennik nagłówków i bibliotek w Windows SDK (starego). Mogą one być używane w połączeniu z GCC. Zarówno projekty, jak i inne firmy zewnętrzne dostarczają natywne wersje GCC dla systemu Windows, które w ogóle nie wymagają Cygwin. Pakiety te mogą być postrzegane jako "pełne" (w stopniu kompletności MinGW (-w64)) zamiennik dla zestawu Windows SDK.

Należy zauważyć, że Cygwin zapewnia także kompilatory krzyżowe Cygwin-Win32: działają one na platformie Cygwin, ale produkują natywne pliki wykonywalne Win32.

Kolejny odtwarzacz, MSYS, jest lekkim widelcem Cygwin, który zapewnia tylko minimalną ilość narzędzi do uruchamiania autotoolów do budowania skryptów w systemie Windows. MSYS musi być używany w połączeniu z natywnymi narzędziami MinGW (-w64), nie jest to Cygwin i nie można łatwo rozszerzyć MSYS.

Tak więc "MinGW (-w64)" często odnosi się do całego Wolnego Windows GNU Toolchain (natywnego lub cross-kompilatora działającego na Cygwin), chociaż ściśle mówiąc jest to tylko nagłówek i biblioteka.

Aby użyć kompilatora C++ GCC, proponuję użyć albo moich pakietów (aby utworzyć pliki wykonywalne 32-bit i 64-bit) lub mingw-builds. Alternatywnie możesz zainstalować Cygwin i użyć jego setup.exe do zainstalowania cross-kompilatora MinGW-w64 i używać go stamtąd, ale jeśli nie potrzebujesz prawie idealnej emulacji Uniksa do skryptów budujących, zasugerowałbym przeciw.

EDIT Może lub nie może mieć świadomość, że nie ma innej alternatywy, stare Interix, który pomija podsystemu Win32 i buduje bezpośrednio na jądrze NT. Jest on dostarczany jako Windows Services for Unix lub Subsystem for Unix Applications (dostępny dla Windows 7 i Windows 8 i older versions of Windows). To rozwiązanie jest dostępne dla klientów wersji systemu Windows Pro/Ultimate i zapewnia najbardziej zbliżoną do rodzimej obsługi systemu Unix, którą otrzymasz. Heck, można nawet użyć Visual Studio do debugowania oprogramowania Unix :)

+0

Czy mógłbyś wyjaśnić, co oznacza to "środowisko wykonawcze kompatybilne z POSIX"? Mam czerwony artykuł w Wikipedii na temat POSIX-u, ale wciąż nie jest to dla mnie jasne. – Celeritas

+0

POSIX definiuje interfejs systemu operacyjnego składający się z wielu funkcji C. Składają się one z biblioteki standardowej C99 (C11?) I każdej dodatkowej funkcji szczegółowo [tutaj] (http://pubs.opengroup.org/onlinepubs/9699919799/). Przykładami są 'fork',' access', wszystkie pthreads (chociaż MinGW (-w64) mają biblioteki opakowujące tę część Win32 API: pthreads-win32 i winpthreads), etc ... POSIX również definiuje powłokę i narzędzia, które jest dostarczany przez Cygwin (i w mniej doskonały sposób, MSYS). To wszystko, co wymaga emulacji, a zatem jest wolniejsze w wykonaniu niż kodowanie w stosunku do natywnego API Win32. – rubenvb

+0

Więc zasadniczo C++ zawiera niektóre funkcje, takie jak 'fork()', które istnieją w systemach operacyjnych Unix, ale nie w systemach operacyjnych Windows? Ponieważ są one technicznie częścią języka, muszą być obsługiwane niezależnie od systemu operacyjnego, więc punktem Cygwin/MinGW jest Windows wie, co zrobić z programem C++, który wykonuje kod 'fork()'? Wydaje się dziwne, że funkcje zależne od systemu operacyjnego są częścią podstawowego języka C++, czy to dlatego, że C/C++ był pierwotnie zaprojektowany dla Uniksa? Na przykład czy nie byłoby sensu pisać "system (fork())"? – Celeritas

8

UWAGA: ta odpowiedź nie udaje się być wyczerpująca, to po prostu chcą zaprezentować prostego zrozumienia koncepcji, z definicji ideologicznych. Używanie nieprecyzyjnego języka jest zamierzone. Więc guru OS, nie oczekuj doskonałych definicji.

Różnica tkwi w korzeniach POSIX/UNIX i Windows.

POSIX to programujący interfejs C dla systemów operacyjnych (między innymi, jak Shell i narzędzia).

Unix i późniejszy Linux implementują takie interfejsy w sobie, Windows natywnie - nie. Ma własny sposób zarządzania obiektami systemu operacyjnego (Win32). Mac OS również tego nie robi.

GCC to zestaw kompilatorów wspólnych w systemach oferujących interfejs POSIX.

Aby użyć go w systemie Windows, trzeba -w tym punkt-dwóch alternatyw:

  • Dodaj do okna biblioteki (kod i nagłówki), który zostanie dodany do okna interfejsu POSIX (tłumaczenia POSIX wzywa do Wywołania Windows) i portuj wszystkie programy GNU (oparte na systemie Linux), kompilując je do korzystania z tej biblioteki: to właśnie robi Cygwin.

  • Przepisuj programy POSIX tak, aby zawierały w sobie wszystko związane z mapowaniem POSIX-Windows, tworząc macierzysty plik wykonywalny systemu Windows: o to chodzi w MinGW i MSYS.

Metody botyczne mają zalety i wady. W skrócie, w Cygwin, jeśli coś kompiluje się pod POSIX-em, kompiluje się pod Cygwin (przynajmniej teoretycznie). Rezultatem jest jednak wyglądający na jeden program działający pod Windowsem.

W MinGW możesz pisać natywne programy Windows (przez natywny interfejs Win32 C), ale nie możesz skompilować wszystkiego, ponieważ używa funkcji POSIX nieobecnych w oknach. Najbardziej oczywistym przypadkiem jest brak standardowego interfejsu MinGW i ograniczonej obsługi <locale>.

+0

Dzięki temu szukam uproszczenia. "POSIX jest interfejsem programowania C dla systemów operacyjnych" co rozumie się przez * programowanie interfejsu *, co oznacza sposób, w jaki program współdziała z systemem operacyjnym? – Celeritas

+2

@Celeritas: dokładnie. POSIX przedstawia system operacyjny hostowanemu programowi jako zestaw wywoływalnych funkcji C. Zauważ, że Windows robi to samo, ale z innym zestawem funkcji. –

+0

GCC tak naprawdę nie oczekuje interfejsu POSIX: może kompilować na/dla wielu różnych systemów (w tym Windows), i nie wszystkie z nich mają pełne interfejsy POSIX C. Zauważ, że używając winpthreads MinGW-w64, libstdC++ może dostarczyć '', '' i '' funkcjonalność, chociaż może nadal mieć pewne dziwactwa. – rubenvb

Powiązane problemy