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?
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.
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.
źródło
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.
źródło
gcc-3 -mno-cygwin
mingw64-x86_64-gcc-core
pakiet Cygwin. MinGW-64 będzie wtedy dostępny jako niezgrabnie nazwanex86_64-w64-mingw32-gcc
polecenie. Boże, proszę, ktoś już jednoczy nazwy tych cholernych rzeczy.Wikipedia porównuje tutaj .
Z Cygwin na stronie internetowej :
Ze strony internetowej Mingw :
źródło
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.
źródło
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…).
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…).
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?
Pytanie nr 4: Standardowe pliki nagłówkowe C lub C ++ nie zapewniają żadnych zaawansowanych funkcji programowania, takich jak wielowątkowość. Co mogę zrobić?
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.
źródło
Z punktu widzenia portowania programu w C dobrym sposobem na zrozumienie tego jest podanie przykładu:
Jeśli zmienimy
stat
na_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.dll
gdzienn
znajduje się przyrostek wersji. Aby wysłać ten program, musimy dołączyć tę bibliotekę DLL. Że DLL zapewnia_stat
,system
iprintf
. (Mamy również opcję statycznego łączenia czasu wykonywania).Pod MinGW program zostanie połączony z
msvcrt.dll
wewnę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:
stat
funkcja zwróci bardzo ograniczone informacje Nr użytecznych uprawnienia lub numer węzła, na przykład.c:file.txt
jest rozwiązywana zgodnie z bieżącym katalogiem roboczym skojarzonym z dyskiemc:
.system
wykorzystujecmd.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) icyggcc_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:
stat
funkcja ma bogatą funkcjonalność, wracając sensownych wartości w większości dziedzin.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.system
funkcja próbuje użyć/bin/sh -c
tłumacza. Cygwin rozpozna/
ścieżkę zgodnie z lokalizacją pliku wykonywalnego i oczekuje, żesh.exe
program 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ć
MessageBox
lubCreateProcess
moż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.dll
lub możliwość ponownej dystrybucjimsvcrtnn.dll
). Przykładem tego jestspawn*
rodzina funkcji takich jakspawnvp
. Jest to dobry pomysł na użycie zamiastfork
iexec
na Cygwin, ponieważ lepiej odwzorowują model tworzenia procesów systemu Windows, który nie ma pojęciafork
.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.dll
Cygwin 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 itermios
współpracuje z konsolą Microsoft! Aplikacja POSIX, która ustawia tryb rawtcsetattr
i używa kodów VT100 do sterowania kursorem, będzie działać bezpośrednio wcmd.exe
oknie. Jeśli chodzi o użytkownika końcowego, jest to natywna aplikacja konsolowa wykonująca wywołania Win32 w celu sterowania konsolą.Jednak:
/bin/sh
i 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.dll
bez 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/bin
systemie 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 Cygnalcygwin1.dll
, ścieżka ta nie będzie miała sensu, a zrozumiec:foo.txt
.źródło
Wikipedia mówi :
źródło
apt-cyg
ponieważ jest to być może nawet łatwiejsze niż używanie apt pod WSL.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.źródło
Inne odpowiedzi już trafiły w cel. Chcę tylko dodać ilustrację, aby szybko złapać.
źródło
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).
źródło
clang
jest realnym rozwiązaniem dla wielu platform.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
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.
źródło
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
gcc
ibash
dostę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.dll
a także statycznie z częściamiglibc
. 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.
źródło
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
mingw
bezcygwin
środowiska, pod warunkiem, że wszystkie niezbędne biblioteki (DLL) są obecne.źródło
Cygwin
używa warstwy zgodności, podczas gdyMinGW
jest natywny. To jedna z głównych różnic.źródło