Jaka jest różnica między Cygwin a MinGW?

657

Chcę, aby mój projekt C ++ był wieloplatformowy i rozważam użycie Cygwin / MinGW. Ale jaka jest różnica między nimi?

Kolejne pytanie dotyczy tego, czy będę w stanie uruchomić plik binarny w systemie bez Cygwin / MinGW?

Łukasz Lew
źródło

Odpowiedzi:

629

Dla uproszczenia wygląda to tak:

  • Skompiluj coś w Cygwin, a ty kompilujesz to dla Cygwin .

  • Skompiluj coś w MinGW i kompilujesz to dla Windows .

O Cygwin

Celem Cygwin jest ułatwienie portowania aplikacji opartych na Uniksie w systemie Windows, poprzez emulację wielu drobnych szczegółów dostarczanych przez systemy operacyjne oparte na Uniksie i udokumentowanych przez standardy POSIX . Twoja aplikacja może korzystać z funkcji uniksowych, takich jak potoki, dostęp do plików i katalogów w stylu uniksowym, i tak dalej, i może być kompilowana z Cygwin, który będzie działał jako warstwa kompatybilności wokół Twojej aplikacji, dzięki czemu wiele z tych specyficznych dla Uniksa paradygmatów może nadal będą używane.

Podczas dystrybucji oprogramowania odbiorca będzie musiał go uruchomić wraz ze środowiskiem wykonawczym Cygwin (dostarczonym przez plik cygwin1.dll). Możesz rozpowszechniać to wraz ze swoim oprogramowaniem, ale oprogramowanie będzie musiało być zgodne z jego licencją typu open source. Może nawet być tak, że nawet po prostu łącząc z nim oprogramowanie, ale oddzielnie dystrybuując bibliotekę DLL, może nadal wymagać honorowania licencji Open Source.

O MinGW

MinGW ma być po prostu portem Windows narzędzi kompilatora GNU, takich jak GCC, Make, Bash i tak dalej. Nie próbuje emulować ani zapewniać pełnej zgodności z Uniksem, ale zapewnia minimalne niezbędne środowisko do korzystania z GCC (kompilatora GNU) i niewielkiej liczby innych narzędzi w systemie Windows. Nie ma warstwy emulacji Unixa, takiej jak Cygwin, ale w rezultacie twoja aplikacja musi być specjalnie zaprogramowana, aby mogła działać w systemie Windows, co może oznaczać znaczną zmianę, jeśli została stworzona w celu uruchomienia w standardowym środowisku Unix i korzysta z funkcji specyficznych dla Uniksa, takich jak te wspomniane wcześniej. Domyślnie kod skompilowany w GCC MinGW będzie się kompilował do natywnego systemu Windows X86, w tym plików .exe i .dll, ale można również kompilować krzyżowo z właściwymi ustawieniami, ponieważ zasadniczo używasz pakietu narzędzi kompilatora GNU.

MinGW jest zasadniczo alternatywą dla kompilatora Microsoft Visual C ++ i powiązanych z nim narzędzi do łączenia / tworzenia. W niektórych przypadkach może być możliwe użycie MinGW do skompilowania czegoś, co było przeznaczone do kompilacji z Microsoft Visual C ++, z odpowiednimi bibliotekami, a w niektórych przypadkach z innymi modyfikacjami.

MinGW zawiera kilka podstawowych standardowych bibliotek do interakcji z systemem operacyjnym Windows, ale tak jak w przypadku zwykłych standardowych bibliotek zawartych w kolekcji kompilatorów GNU, nie nakładają one ograniczeń licencyjnych na utworzone oprogramowanie.

W przypadku nietrywialnych aplikacji tworzenie ich na wiele platform może być poważnym wyzwaniem, chyba że zastosujesz kompleksową platformę dla wielu platform. W czasie, gdy to pisałem, framework Qt był jednym z najpopularniejszych do tego celu, umożliwiając tworzenie aplikacji graficznych, które działają w różnych systemach operacyjnych, w tym Windows, ale są też inne opcje. Jeśli używasz takiego frameworka od samego początku, możesz nie tylko zmniejszyć bóle głowy, gdy przychodzi czas na przeniesienie na inną platformę, ale możesz użyć tych samych widżetów graficznych - okien, menu i elementów sterujących - na wszystkich platformach, jeśli piszesz GUI i niech wydają się natywne dla użytkownika.

thomasrutter
źródło
43
Bash dostarczany z MinGW nie jest rodzimym programem Windows. Zależy to od biblioteki MSYS DLL, która jest rozwidleniem biblioteki DLL Cygwin. To samo dotyczy wielu innych narzędzi Uniksa, które są dostarczane z MinGW / MSYS. MinGW gcc jest jednak programem macierzystym. Marka jest dostępna zarówno w wersji natywnej, jak i MSYS.
ak2
6
jakieś różnice pod względem prędkości?
EKanadily
6
Różnica prędkości będzie niezauważalna w większości sytuacji. Każda różnica sprowadza się do tego, o ile dodatkowy poziom abstrakcji zapewniany przez warstwę kompatybilności cygwin spowalnia. Może to mieć wymierny wpływ na takie rzeczy jak I / O. Na przykład dawno temu Git działał w systemie Windows tylko w cygwinie i dlatego był nieco wolniejszy. Z drugiej strony, jeśli kodujesz za pomocą frameworka, jest to również warstwa abstrakcji, która może i tak spowolnić niektóre rzeczy.
thomasrutter
28
Powinienem zauważyć, że kod skompilowany dla cygwina jest nadal rodzimym kodem - nie trzeba go uruchamiać przez interpretera takiego jak np. Java. Po prostu, gdy musi wchodzić w interakcje z niektórymi funkcjami systemu operacyjnego, takimi jak dysk / plik, przechodzi przez inną warstwę.
thomasrutter
4
Ogólnie rzecz biorąc, nie byłbyś w stanie porównać, ponieważ musisz napisać swój kod inaczej w zależności od tego, czy jest to cygwin, czy nie. Chociaż dla każdego małego, prostego oprogramowania, takiego jak „witaj świecie”, odpowiednik cygwina będzie większy tylko ze względu na bibliotekę uruchomieniową cygwina. Jeśli nie policzysz wielkości biblioteki wykonawczej cygwin, wersja cygwina będzie zwykle mniejsza, ale myślę, że to nieprawda, ponieważ biblioteka będzie praktycznie zawsze musiała być dostarczana z oprogramowaniem. To powiedziawszy, jeśli używasz nietrywialnych bibliotek / frameworków, to bardziej zależy od tego.
thomasrutter
311

Cygwin to próba stworzenia kompletnego środowiska UNIX / POSIX w systemie Windows. W tym celu wykorzystuje różne biblioteki DLL. Chociaż te biblioteki DLL są objęte GPLv3 +, ich licencja zawiera wyjątek , który nie wymusza objęcia dzieła pochodnego GPLv3 +. MinGW to pakiet kompilatorów C / C ++, który pozwala tworzyć pliki wykonywalne systemu Windows bez zależności od takich bibliotek DLL - potrzebujesz tylko normalnych środowisk uruchomieniowych MSVC, które są częścią każdej normalnej instalacji systemu Microsoft Windows.

Możesz również uzyskać małe środowisko podobne do UNIX / POSIX, skompilowane z MinGW o nazwie MSYS . Nie ma nigdzie blisko wszystkich funkcji Cygwin, ale jest idealny dla programistów, którzy chcą korzystać z MinGW.

Cole Johnson
źródło
59
Ale jeśli chcę wypuścić darmowe oprogramowanie inne niż GPL? Przepraszam, nie jestem fanem GPL, to wszystko.
19
@ Dan Nie musisz redystrybuować środowiska wykonawczego używanego przez MinGW - jest to część systemu Windows.
14
@ ak2: to prawda, ale wprowadza w błąd. cygwyn gcc + środowisko cygwin domyślnie tworzy pliki binarne powiązane z biblioteką dll cygwin (GPL). mingw + msys domyślnie tworzy pliki binarne powiązane z biblioteką C platformy.
Sean McMillan
4
@DanMoulding Jeśli nie jesteś fanem Microsoft, będziesz musiał zignorować te uczucia, aby opracować system Windows. ;-)
Arda Xi
14
@anon „Ale jeśli chcę wypuścić darmowe oprogramowanie inne niż GPL?” .. cygwin ma specjalny wyjątek w swoich warunkach licencyjnych, który pozwala dystrybuować darmowe oprogramowanie powiązane z nim na podstawie innych licencji innych niż GPL. Zobacz „Wyjątek dotyczący licencjonowania Open Source” tutaj: cygwin.com/licensing.html
Steve Cook
138

Aby dodać do innych odpowiedzi, Cygwin jest dostarczany z bibliotekami i nagłówkami MinGW i można je skompilować bez łączenia się z cygwin1.dll przy użyciu flagi -mno-cygwin z gcc. Zdecydowanie wolę to od zwykłego MinGW i MSYS.

TrayMan
źródło
31
To już nie działa z cygwin 1.7.6. gcc: Flaga -mno-cygwin została usunięta; użyj ukierunkowanego kompilatora mingw.
sigjuice
2
@sigjuice: prawda, ale stara flaga -mno-cygwin nadal działa w GCC 3.x:gcc-3 -mno-cygwin
Amro
1
Czy to oznacza, że ​​muszę pobrać biblioteki mingw z oficjalnej strony mingw, aby skompilować do celu mingw z hosta cygwin? Czy te biblioteki można pobrać z systemu pakietów Cygwin?
CMCDragonkai
5
@CMCDragonkai Możesz uzyskać kompilatory kompatybilne z mingw ze strony Cygwin, uruchamiając narzędzie instalacyjne oraz znajdując i zaznaczając je. Więc nawet jeśli gcc nie generuje już kodu kompatybilnego z mingw, możesz w Cygwin uruchomić „mingw-gcc” (to nie jest pełna nazwa), aby stworzyć ten sam rodzaj pliku wykonywalnego, który kompilator mingw pod msys.
mężczyzna z kosmosu w Cardiff
9
Aby zmienić pomocną odpowiedź Cardiff, pakiety i polecenia MinGW Cygwina mają nieco niejasne nazwy. Aby zainstalować MinGW-64 (w dzisiejszych czasach właściwie to, czego zawsze chcesz ), zainstaluj mingw64-x86_64-gcc-corepakiet Cygwin. MinGW-64 będzie wtedy dostępny jako niezgrabnie nazwane x86_64-w64-mingw32-gccpolecenie. Boże, proszę, ktoś już jednoczy nazwy tych cholernych rzeczy.
Cecil Curry
60

Wikipedia porównuje tutaj .

Z Cygwin na stronie internetowej :

  • Cygwin to środowisko podobne do systemu Linux dla systemu Windows. Składa się z dwóch części: biblioteki DLL (cygwin1.dll), która działa jako warstwa emulacji interfejsu API systemu Linux, zapewniając znaczną funkcjonalność interfejsu API systemu Linux.
  • Zbiór narzędzi zapewniających wygląd i działanie systemu Linux.

Ze strony internetowej Mingw :

MinGW („Minimalistyczne GNU dla systemu Windows”) to zbiór swobodnie dostępnych i swobodnie dystrybuowanych plików nagłówkowych i bibliotek importu specyficznych dla systemu Windows w połączeniu z zestawami narzędzi GNU, które pozwalają tworzyć rodzime programy Windows, które nie są oparte na żadnych bibliotekach DLL środowiska wykonawczego C innych firm

bezpośrednio
źródło
47

Cygwin używa biblioteki DLL, cygwin.dll (lub zestawu bibliotek DLL), aby zapewnić środowisko uruchomieniowe podobne do POSIX w systemie Windows.

MinGW kompiluje się do natywnej aplikacji Win32.

Jeśli zbudujesz coś za pomocą Cygwin, każdy system, w którym go zainstalujesz, będzie również potrzebował bibliotek DLL Cygwin. Aplikacja MinGW nie wymaga specjalnego środowiska wykonawczego.

Michael Burr
źródło
42

Przeczytaj odpowiedzi na pytania, aby zrozumieć różnicę między Cygwin a MinGW.


Pytanie nr 1: Chcę utworzyć aplikację, w której raz piszę kod źródłowy, skompiluję go raz i uruchomię na dowolnej platformie (np. Windows, Linux i Mac OS X…).

Odpowiedź nr 1: Napisz kod źródłowy w JAVA. Skompiluj kod źródłowy raz i uruchom go w dowolnym miejscu.


Pytanie nr 2: Chcę utworzyć aplikację, w której raz piszę kod źródłowy, ale nie ma problemu, że kompiluję kod źródłowy dla dowolnej platformy osobno (np. Windows, Linux i Mac OS X…).

Odpowiedź # 2: Napisz kod źródłowy w C lub C ++. Używaj tylko standardowych plików nagłówkowych. Użyj odpowiedniego kompilatora dla dowolnej platformy (np. Visual Studio dla Windows, GCC dla Linux i XCode dla Mac). Pamiętaj, że nie powinieneś używać żadnych zaawansowanych funkcji programowania do pomyślnego kompilowania kodu źródłowego na wszystkich platformach. Jeśli nie używasz żadnych standardowych klas ani funkcji C lub C ++, kod źródłowy nie kompiluje się na innych platformach.


Pytanie nr 3: W odpowiedzi na pytanie nr 2 trudno jest użyć innego kompilatora dla każdej platformy, czy istnieje jakiś kompilator dla wielu platform?

Odpowiedź # 3: Tak, użyj kompilatora GCC. Jest to kompilator wieloplatformowy. Aby skompilować kod źródłowy w systemie Windows, użyj programu MinGW, który udostępnia kompilator GCC dla systemu Windows i kompiluje kod źródłowy do rodzimego programu Windows. Nie używaj żadnych zaawansowanych funkcji programowania (takich jak Windows API) do pomyślnego skompilowania kodu źródłowego na wszystkich platformach. Jeśli korzystasz z funkcji Windows API, kod źródłowy nie kompiluje się na innych platformach.


Pytanie nr 4: Standardowe pliki nagłówkowe C lub C ++ nie zapewniają żadnych zaawansowanych funkcji programowania, takich jak wielowątkowość. Co mogę zrobić?

Odpowiedź # 4: Powinieneś użyć standardu POSIX (Portable Operating System Interface [dla UNIX]). Zapewnia wiele zaawansowanych funkcji i narzędzi programistycznych. Wiele systemów operacyjnych w pełni lub częściowo kompatybilnych z POSIX (takich jak Mac OS X, Solaris, BSD / OS i ...). Niektóre systemy operacyjne, które nie są oficjalnie certyfikowane jako zgodne z POSIX, są w dużej mierze zgodne (np. Linux, FreeBSD, OpenSolaris i ...). Cygwin zapewnia środowisko programistyczne i wykonawcze w dużej mierze zgodne z POSIX.


A zatem:

Aby skorzystać z zalet kompilatora wieloplatformowego GCC w systemie Windows, użyj MinGW.

Aby skorzystać z zalet zaawansowanych zaawansowanych funkcji programowania i narzędzi POSIX w systemie Windows, skorzystaj z Cygwin.

Amir Saniyan
źródło
4
O twoim małym FAQ: 1) Masz rację, jeśli potrzebujesz czegoś, co działa gdziekolwiek i nie trzeba go kompilować, wybierz coś takiego jak Java (nie zapomnij też o Pythonie, Perlu, Ruby i pozostałych językach skryptowych) 2) Jest to nieco niewłaściwe w przypadku C, ponieważ wszystkie kompilatory C wspierają go bardzo dobrze. 3) Nadal możesz używać interfejsu API Win32, ale musisz owinąć go w warstwę przenośności, więc jest to tylko problem projektowy.
Coyote21,
1
4) Jest to całkowicie błędne, z powodów, które podałem powyżej, ponieważ POSIX jest tylko innym interfejsem API, także jeśli bronisz tyle POSIX, powinieneś wiedzieć, że nawet Unices nie muszą implementować tego samego zestawu POSIX, więc jak radzisz sobie z tym? Przychodzi na myśl interfejs POSIX w czasie rzeczywistym. I to sprawia, że ​​wniosek jest całkowicie fałszywy i błędny, ponieważ nie potrzebujesz POSIX do niczego w systemie Windows, możesz po prostu użyć Win32 API. Albo jak myślisz, jak Qt, GTK i WxWidgets znalazły sposób, aby być wieloplatformowym, myślę, że wszyscy muszą używać cygwina w systemie Windows. -1 głosuj na twoją odpowiedź.
Coyote21,
4
Nie rozumiem twojego argumentu, @ Coyote21. Czy twierdzisz, że POSIX nie nadaje się do programowania na różnych platformach? Czy mówisz, że jedynym odpowiednim sposobem pisania kodu w C / C ++ dla wielu platform jest napisanie własnej warstwy kompatybilności dla każdej platformy, którą chcesz obsługiwać? Nie widzę nic złego w sugestii, aby zacząć od POSIX. Musisz sprawdzić, jak daleko może się ono dostać i czy wymagane będzie rozległe rozwiązanie warstwy zgodności. Duże warstwy zgodności nie są normą. Powiedzieć inaczej, to argumentować, że POSIX jest całkowitą porażką.
David Gladfelter
Wielowątkowość jest implementowana przez warstwę POSIX, nawet w MinGW.
Alexander Shishenko
1
„nie powinieneś używać żadnych zaawansowanych funkcji programowania do pomyślnego kompilowania kodu źródłowego na wszystkich platformach”. Naprawdę musisz wyjaśnić, co rozumiesz przez „zaawansowane funkcje programowania”. W oparciu o późniejsze zdanie sądzę, że masz na myśli funkcje specyficzne dla platformy . Jeśli miałeś na myśli nowoczesne funkcje językowe, to nie, ponieważ istnieją kompetentne kompilatory dla „wszystkich [głównych] platform” i nie powinniśmy pozbawiać się funkcji tylko po to, aby wspierać tych, których kompilatory lub biblioteki wciąż pozostają w tyle. Dzięki przyzwoitemu kompilatorowi, standardowemu C / ++ i bibliotekom wieloplatformowym możemy być bardzo zaawansowani.
podkreślenie_d
34

Z punktu widzenia portowania programu w C dobrym sposobem na zrozumienie tego jest podanie przykładu:

#include <sys/stat.h>
#include <stdlib.h>

int main(void)
{
   struct stat stbuf;
   stat("c:foo.txt", &stbuf);
   system("command");
   printf("Hello, World\n");
   return 0;
}

Jeśli zmienimy statna _stat, możemy skompilować ten program za pomocą Microsoft Visual C. Możemy również skompilować ten program za pomocą MinGW i Cygwin.

W Microsoft Visual C program będzie połączony z redystrybucyjną biblioteką wykonawczą MSVC: mxvcrtnn.dllgdzie nnznajduje się przyrostek wersji. Aby wysłać ten program, musimy dołączyć tę bibliotekę DLL. Że DLL zapewnia _stat, systemi printf. (Mamy również opcję statycznego łączenia czasu wykonywania).

Pod MinGW program zostanie połączony z msvcrt.dllwewnętrzną, nieudokumentowaną, niewersjonowaną biblioteką, która jest częścią systemu Windows, i jest ograniczony do użytku aplikacji. Ta biblioteka jest zasadniczo rozwidleniem redystrybucyjnej biblioteki wykonawczej MS Visual C do użytku przez sam system Windows.

W obu przypadkach program będzie miał podobne zachowania:

  • statfunkcja zwróci bardzo ograniczone informacje Nr użytecznych uprawnienia lub numer węzła, na przykład.
  • ścieżka c:file.txt jest rozwiązywana zgodnie z bieżącym katalogiem roboczym skojarzonym z dyskiem c:.
  • system wykorzystuje cmd.exe /c do uruchamiania zewnętrznego polecenia.

Możemy również skompilować program pod Cygwin. Podobnie jak redystrybucyjny czas pracy używany przez MS Visual C, program Cygwin zostanie powiązany z bibliotekami czasu wykonywania Cygwin:cygwin1.dll Cygwin (Cygwin właściwy) i cyggcc_s-1.dll(obsługa czasu pracy GCC). Ponieważ Cygwin jest obecnie objęty licencją LGPL, możemy spakować nasz program, nawet jeśli nie jest to bezpłatne oprogramowanie zgodne z GPL, i wysłać program.

Pod Cygwin funkcje biblioteki będą zachowywać się inaczej:

  • statfunkcja ma bogatą funkcjonalność, wracając sensownych wartości w większości dziedzin.
  • ścieżka c:file.txt nie jest w ogóle rozumiana jako zawierająca odniesienie do litery dysku, ponieważ c:nie następuje po niej ukośnik. Okrężnica jest uważana za część nazwy i jakoś w nią wplątana. W Cygwin nie ma koncepcji ścieżki względnej względem woluminu lub dysku, nie ma koncepcji „aktualnie zalogowanego dysku” i nie ma bieżącego katalogu roboczego na dysk.
  • systemfunkcja próbuje użyć /bin/sh -ctłumacza. Cygwin rozpozna /ścieżkę zgodnie z lokalizacją pliku wykonywalnego i oczekuje, że sh.exeprogram znajdzie się w tym samym miejscu co plik wykonywalny.

Zarówno Cygwin, jak i MinGW pozwalają na korzystanie z funkcji Win32. Jeśli chcesz zadzwonić MessageBoxlub CreateProcessmożesz to zrobić. Możesz również łatwo zbudować program, który nie wymaga okna konsoli, używającgcc -mwindows , pod MinGW i Cygwin.

Cygwin nie jest ściśle POSIX. Oprócz zapewnienia dostępu do interfejsu API systemu Windows, zapewnia także własne implementacje niektórych funkcji Microsoft C (rzeczy znalezione w czasie wykonywania msvcrt.dlllub możliwość ponownej dystrybucji msvcrtnn.dll). Przykładem tego jest spawn*rodzina funkcji takich jak spawnvp. Jest to dobry pomysł na użycie zamiast forki execna Cygwin, ponieważ lepiej odwzorowują model tworzenia procesów systemu Windows, który nie ma pojęcia fork.

A zatem:

  • Programy Cygwin są nie mniej „rodzime” niż programy MS Visual C z tego względu, że wymagają akompaniamentu bibliotek. Oczekuje się, że implementacje języka programowania w systemie Windows zapewnią własny czas działania, nawet implementacje w języku C. W systemie Windows nie ma „libc” do użytku publicznego.

  • Fakt, że MinGW nie wymaga biblioteki DLL innej firmy, jest w rzeczywistości wadą; zależy to od nieudokumentowanego wewnętrznego rozwidlenia środowiska wykonawczego Visual C w systemie Windows. Robi to MinGW, ponieważ ma zastosowanie wyjątek biblioteki systemowej GPL msvcrt.dll, co oznacza, że ​​programy edytowane w GPL mogą być kompilowane i rozpowszechniane w MinGW.

  • Ze względu na znacznie szersze i głębsze wsparcie dla POSIX w porównaniu do msvcrt.dllCygwin jest zdecydowanie lepszym środowiskiem do przenoszenia programów POSIX. Ponieważ jest obecnie objęty licencją LGPL, pozwala na redystrybucję aplikacji z różnego rodzaju licencjami, open source lub open source. Cygwin zawiera nawet emulację VT100 i termioswspółpracuje z konsolą Microsoft! Aplikacja POSIX, która ustawia tryb raw tcsetattri używa kodów VT100 do sterowania kursorem, będzie działać bezpośrednio w cmd.exeoknie. Jeśli chodzi o użytkownika końcowego, jest to natywna aplikacja konsolowa wykonująca wywołania Win32 w celu sterowania konsolą.

Jednak:

  • Jako natywne narzędzie programistyczne dla systemu Windows, Cygwin ma pewne dziwactwa, takie jak obsługa ścieżek, która jest obca dla systemu Windows, zależność od niektórych zakodowanych ścieżek, jak /bin/shi innych problemów. Te różnice sprawiają, że programy Cygwin są „nienatywne”. Jeśli program przyjmuje ścieżkę jako argument lub dane wejściowe z okna dialogowego, użytkownicy systemu Windows oczekują, że ścieżka będzie działać tak samo jak w innych programach systemu Windows. Jeśli to nie działa w ten sposób, to jest problem.

Wtyczka: Niedługo po ogłoszeniu LGPL rozpocząłem projekt Cygnal (Cygwin Native Application Library), aby zapewnić rozwidlenie biblioteki DLL Cygwin, która ma na celu rozwiązanie tych problemów. Programy można rozwijać w ramach Cygwin, a następnie wdrażać w wersji Cygnal cygwin1.dllbez ponownej kompilacji. W miarę udoskonalania tej biblioteki stopniowo eliminuje potrzebę korzystania z MinGW.

Gdy Cygnal rozwiąże problem z obsługą ścieżek, możliwe będzie opracowanie jednego pliku wykonywalnego, który działa ze ścieżkami Windows, gdy jest dostarczany jako aplikacja Windows z Cygnal i płynnie współpracuje ze ścieżkami Cygwin, gdy jest zainstalowany w twoim /usr/binsystemie Cygwin. W Cygwinie plik wykonywalny będzie działał transparentnie z ścieżką podobną do /cygdrive/c/Users/bob. W natywnym wdrożeniu, w którym łączy się z Cygnal cygwin1.dll, ścieżka ta nie będzie miała sensu, a zrozumie c:foo.txt.

Kaz
źródło
2
Doskonała odpowiedź. Kluczem jest wyjaśnienie, co się dzieje, gdy ten sam fragment kodu jest kompilowany, łączony i wykonywany w każdym z 3 środowisk.
drlolly
@Kaz Jak idzie rozwój? Brzmi interesująco, ale wydaje się martwy od co najmniej roku wstecz. Dlaczego nie korzystasz z GitHub, aby ludzie mogli pomagać i brać udział?
not2qubit
2
@ not2qubit Wydaje mi się, że mam lepszą kontrolę nad moimi projektami, gdy są one hostowane na moim własnym serwerze, który sam kontroluję. Używam git; repozytorium można wyciągnąć. Mogę przyjmować żądania ściągania przez e-mail (tak jak zaprojektował je Linus Torvalds). Mogę również przyznać konto z uprawnieniami do zatwierdzania komuś, kto zostanie współautorem na poziomie opiekuna. Cygnal działa dobrze; Regularnie dołączam go do wersji Windows nowych wersji języka TXR. Kiedyś na początku 2019 r. Zmienię Cygnal na nową linię bazową Cygwin.
Kaz
@ not2qubit Należy pamiętać, że wszystkie 17 kwestii w porządku dziennym Cygnal są takie same. Nikt nie zasugerował żadnych nowych wymagań ani nie skarżył się na sposób obsługi tych 17. więc nie jest wymagane żadne inne opracowanie niż przejście na nowszą wersję Cygwin, co nie jest niezwykle pilne.
Kaz
27

Wikipedia mówi :

MinGWrozwidlony od wersji 1.3.3 z Cygwin. Mimo, że oba Cygwin i MinGWmoże być używany do portu UNIXoprogramowania Windows, mają różne podejścia: Cygwinma zapewnić kompletne POSIX layer , który zapewnia emulacje kilku wywołań systemowych i bibliotek, które istnieją na Linux, UNIXoraz BSDwariantach. POSIX layer Biegnie na górę Windows, w razie potrzeby poświęcania wydajności dla kompatybilności. W związku z tym takie podejście wymaga Windows, aby programy napisane w programie Cygwindziałały na bazie biblioteki kompatybilności opartej na copyleft, która musi być dystrybuowana wraz z programem wraz z programem source code. MinGWma na celu zapewnienie natywnej funkcjonalności i wydajności bezpośrednio Windows API calls. W przeciwieństwie Cygwin,MinGWnie wymaga warstwy kompatybilności, DLLdlatego programy nie muszą być dystrybuowane source code.

Ponieważ MinGWjest zależne Windows API calls, nie może zapewnić pełnego POSIX API; nie jest w stanie skompilować niektórych, UNIX applicationsktóre można skompilować Cygwin. W szczególności odnosi się to do zastosowań wymagających POSIXfunkcjonalności jak fork(), mmap()czy ioctl()i te, które oczekują, aby być prowadzone w POSIX environment. Aplikacje napisane przy użyciu cross-platform libraryktóra sama została przeniesiona do MinGW, na przykład SDL, wxWidgets, Qt, lub GTK+, zazwyczaj skompilować jak łatwo w MinGWtak samo, jak w Cygwin.

Połączenie MinGWi MSYSzapewnia małe, niezależne środowisko, które można załadować na nośnik wymienny bez pozostawiania wpisów w rejestrze lub plików na komputerze. CygwinPortable zapewnia podobną funkcję. Zapewniając większą funkcjonalność, Cygwin staje się bardziej skomplikowana w instalacji i utrzymaniu.

Możliwe jest również cross-compile Windows applicationsz MinGW-GCC under POSIX systems. Oznacza to, że programiści nie potrzebują instalacji systemu Windows, MSYSaby skompilować oprogramowanie, które będzie działać Windowsbez niego Cygwin.

PersianGulf
źródło
2
Zdecydowanie nie „bardziej skomplikowane w instalacji i utrzymaniu” ! Użyj, apt-cygponieważ jest to być może nawet łatwiejsze niż używanie apt pod WSL.
not2qubit
14

Nie przegap oprogramowania U / Win firmy AT&T , które ma pomóc w kompilacji aplikacji uniksowych w systemie Windows (ostatnia wersja - 2012-08-06; używa Eclipse Public License, wersja 1.0).

Podobnie jak Cygwin muszą biec przeciwko bibliotece; w ich przypadku POSIX.DLL. Faceci z AT&T są wspaniałymi inżynierami (ta sama grupa, która przyniosła ci ksh i kropkę ), a ich rzeczy są warte sprawdzenia.

Norman Ramsey
źródło
4
Wow, to są złe strony internetowe. W końcu udało mi się znaleźć link do pobrania na stronie www2.research.att.com/sw/download , ale nie miałem dokumentacji online ani informacji o projekcie.
Fantius
1
Chociaż informacje są przydatne, uważam, że może to być odpowiedź na pytanie dotyczące alternatyw dla MingW lub Cygwin, a nie na to pytanie.
Vivek,
12

Inne odpowiedzi już trafiły w cel. Chcę tylko dodać ilustrację, aby szybko złapać.

wprowadź opis zdjęcia tutaj

smwikipedia
źródło
11

Cygwin emuluje całe środowisko POSIX, podczas gdy MinGW to minimalny zestaw narzędzi do kompilacji (kompiluje natywną aplikację Win.) Więc jeśli chcesz, aby twój projekt był wieloplatformowy, wybór między nimi jest oczywisty, MinGW.

Chociaż możesz rozważyć użycie VS w systemie Windows, GCC w Linux / Unices. Robi to większość projektów typu open source (np. Firefox lub Python).

vartec
źródło
„Większość” wydaje się tutaj bezsensownym słowem łasicy, szczególnie z tylko 2 przykładami i bez statystyk. Wiele projektów FOSS wrzuca plik projektu VS jako gest tokena, podejrzewam, że jest bardziej dokładny. Ale jeśli doświadczenie z przeszłości jest czymś innym, GCC lub Clang są zwykle bezpieczniejsze, ponieważ VS ma tendencję do pozostawania w tyle w miarę ewolucji standardów językowych.
underscore_d
To odpowiedź z 2009 roku. W dzisiejszych czasach GCC wygląda jeszcze bardziej ponuro. Jeśli chodzi o „większość”, jeśli mierzysz wpływ, tylko Firefox i sam Chrome mają więcej użytkowników niż cokolwiek innego.
vartec
2
Od czasu, gdy odpowiedziałem, zmieniło się to, że teraz clangjest realnym rozwiązaniem dla wielu platform.
vartec
9

Zauważ, że zachowanie narzędzi może naprawdę różnić się między nimi.

Na przykład tar Cygwin może rozwidlać - ponieważ fork () jest obsługiwany w bibliotece DLL - gdzie wersja mingw nie może. Jest to problem podczas próby skompilowania mysql ze źródła.


źródło
Dlatego w pełni rozwinięte środowiska obsługujące MinGW, np. MSYS2, oferują Cygwin lub inną warstwę w pełni kompatybilną z POSIX dla niskopoziomowych nakrętek i śrub łańcuchów narzędzi potrzebnych podczas budowy. Następnie faktyczna kompilacja i łączenie jest pozostawione w pełni natywnemu kompilatorowi MinGW. MSYS2 jest naprawdę fajny.
underscore_d
9

Aby korzystać z Cygwin w komercyjnej / zastrzeżonej / nie-open-source aplikacji, będziesz musiał wydać dziesiątki tysięcy dolarów na „ wykup licencji ” od Red Hat; unieważnia to standardowe warunki licencyjne przy znacznych kosztach. Google „kosztuje licencję cygwin” i widzi kilka pierwszych wyników.

W przypadku mingw takie koszty nie są ponoszone, a licencje (PD, BSD, MIT) są wyjątkowo liberalne. Co najwyżej można oczekiwać od aplikacji szczegółowych informacji o licencji, takich jak licencja winpthreads wymagana podczas korzystania z mingw64-tdm.

EDYCJA dzięki Izzy Helianthus: Licencja komercyjna nie jest już dostępna ani konieczna, ponieważ biblioteka API znaleziona w podkatalogu Cygwin winsup jest teraz dystrybuowana na licencji LGPL, w przeciwieństwie do pełnej licencji GPL.

Inżynier
źródło
2
Aktualizacja strony Redhat (link z „wykupu licencji” - „Od 1 marca 2016 r. Red Hat nie sprzedaje już komercyjnej licencji wykupu dla Cygwin. Licencja komercyjna nie jest już konieczna, ponieważ Cygwin jest teraz dystrybuowany na licencji GNU Lesser GPL (LGPL). ”> Ze strony Cygwin. Biblioteka Cygwin ™ API znaleziona w podkatalogu winsup kodu źródłowego jest objęta GNU Lesser General Public License (LGPL) w wersji 3 lub nowszej. Aby uzyskać szczegółowe informacje na temat wymagań LGPLv3, przeczytaj GNU Lesser General Public License (LGPL).
Izzy Helianthus
6

Cygwin został zaprojektowany w celu zapewnienia mniej lub bardziej kompletnego środowiska POSIX dla systemu Windows, w tym obszernego zestawu narzędzi zaprojektowanych w celu zapewnienia pełnowartościowej platformy podobnej do systemu Linux. Dla porównania, MinGW i MSYS zapewniają lekką, minimalistyczną warstwę podobną do POSIX, z tylko bardziej niezbędnymi narzędziami, takimi jak gcci bashdostępnymi. Z powodu bardziej minimalistycznego podejścia MinGW, nie zapewnia ono stopnia pokrycia POSIX API, jaki oferuje Cygwin, a zatem nie może budować niektórych programów, które w innym przypadku mogłyby zostać skompilowane na Cygwin.

Jeśli chodzi o kod generowany przez oba, łańcuch narzędzi Cygwin opiera się na dynamicznym łączeniu z dużą biblioteką środowiska wykonawczego cygwin1.dll, podczas gdy łańcuch narzędzi MinGW kompiluje kod do plików binarnych, które łączą się dynamicznie z natywną biblioteką C systemu Windows, msvcrt.dlla także statycznie z częściami glibc. Pliki wykonywalne Cygwin są zatem bardziej kompaktowe, ale wymagają osobnej redystrybucyjnej biblioteki DLL, podczas gdy pliki binarne MinGW mogą być wysyłane autonomicznie, ale zwykle są większe.

Fakt, że programy oparte na Cygwin wymagają osobnej biblioteki DLL do uruchomienia, prowadzi również do ograniczeń licencyjnych. Biblioteka środowiska wykonawczego Cygwin jest licencjonowana na licencji GPLv3 z wyjątkiem linku dla aplikacji z licencjami zgodnymi z OSI, więc programiści, którzy chcą zbudować aplikację z zamkniętym kodem źródłowym wokół Cygwin, muszą nabyć licencję komercyjną od Red Hat. Z drugiej strony, kod MinGW może być wykorzystywany zarówno w aplikacjach typu open source, jak i open source, ponieważ nagłówki i biblioteki są licencjonowane w sposób dozwolony.

bwDraco
źródło
3

Cygwin to środowisko uniksopodobne i interfejs wiersza poleceń dla systemu Microsoft Windows.

Mingw jest rodzimym portem oprogramowania GNU Compiler Collection (GCC) dla Microsoft Windows, wraz z zestawem swobodnie dystrybuowanych bibliotek importu i plików nagłówkowych dla Windows API. MinGW pozwala programistom tworzyć natywne aplikacje Microsoft Windows.

Można uruchamiać pliki binarne wygenerowane mingwbez cygwinśrodowiska, pod warunkiem, że wszystkie niezbędne biblioteki (DLL) są obecne.

gimel
źródło
1

Cygwinużywa warstwy zgodności, podczas gdy MinGWjest natywny. To jedna z głównych różnic.

użytkownik3362761
źródło