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?
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?
Odpowiedzi:
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.
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.
gcc-3 -mno-cygwin
mingw64-x86_64-gcc-core
pakiet Cygwin. MinGW-64 będzie wtedy dostępny jako niezgrabnie nazwane x86_64-w64-mingw32-gcc
polecenie. Boże, proszę, ktoś już jednoczy nazwy tych cholernych rzeczy.
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
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.
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:
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 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
gdzie nn
znajduje się przyrostek wersji. Aby wysłać ten program, musimy dołączyć tę bibliotekę DLL. Że DLL zapewnia _stat
, system
i printf
. (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 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:
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, że sh.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
lub CreateProcess
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 dystrybucji msvcrtnn.dll
). Przykładem tego jest spawn*
rodzina funkcji takich jak spawnvp
. Jest to dobry pomysł na użycie zamiast fork
i exec
na 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.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 i termios
współpracuje z konsolą Microsoft! Aplikacja POSIX, która ustawia tryb raw tcsetattr
i używa kodów VT100 do sterowania kursorem, będzie działać bezpośrednio w cmd.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 Cygnal cygwin1.dll
, ścieżka ta nie będzie miała sensu, a zrozumie c:foo.txt
.
MinGW
rozwidlony od wersji 1.3.3 zCygwin
. Mimo, że obaCygwin
iMinGW
może być używany do portuUNIX
oprogramowaniaWindows
, mają różne podejścia:Cygwin
ma zapewnić kompletnePOSIX layer
, który zapewnia emulacje kilku wywołań systemowych i bibliotek, które istnieją naLinux
,UNIX
orazBSD
wariantach.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 wymagaWindows
, aby programy napisane w programieCygwin
działały na bazie biblioteki kompatybilności opartej na copyleft, która musi być dystrybuowana wraz z programem wraz z programemsource code
.MinGW
ma na celu zapewnienie natywnej funkcjonalności i wydajności bezpośrednioWindows API calls
. W przeciwieństwieCygwin
,MinGW
nie wymaga warstwy kompatybilności,DLL
dlatego programy nie muszą być dystrybuowanesource code
.Ponieważ
MinGW
jest zależneWindows API calls
, nie może zapewnić pełnegoPOSIX API
; nie jest w stanie skompilować niektórych,UNIX applications
które można skompilowaćCygwin
. W szczególności odnosi się to do zastosowań wymagającychPOSIX
funkcjonalności jakfork()
,mmap()
czyioctl()
i te, które oczekują, aby być prowadzone wPOSIX environment
. Aplikacje napisane przy użyciucross-platform library
która sama została przeniesiona doMinGW
, na przykładSDL
,wxWidgets
,Qt
, lubGTK+
, zazwyczaj skompilować jak łatwo wMinGW
tak samo, jak wCygwin
.Połączenie
MinGW
iMSYS
zapewnia 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.Cygwin
Portable 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 applications
zMinGW-GCC under POSIX systems
. Oznacza to, że programiści nie potrzebują instalacji systemu Windows,MSYS
aby skompilować oprogramowanie, które będzie działaćWindows
bez niegoCygwin
.
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.
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).
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.
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.
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
i bash
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ęś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.
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
bez cygwin
środowiska, pod warunkiem, że wszystkie niezbędne biblioteki (DLL) są obecne.
Cygwin
używa warstwy zgodności, podczas gdy MinGW
jest natywny. To jedna z głównych różnic.