C ++ proje çapraz platformumu yapmak istiyorum ve Cygwin / MinGW kullanmayı düşünüyorum. Ama aralarındaki fark nedir?
Başka bir soru, Cygwin / MinGW'siz bir sistemde ikili dosyayı çalıştırabileceğim mi?
C ++ proje çapraz platformumu yapmak istiyorum ve Cygwin / MinGW kullanmayı düşünüyorum. Ama aralarındaki fark nedir?
Başka bir soru, Cygwin / MinGW'siz bir sistemde ikili dosyayı çalıştırabileceğim mi?
Yanıtlar:
Bir sadeleştirme olarak, şöyle:
Cygwin şey derlemek ve bunu derleme Cygwin için .
MinGW'de bir şey derleyin ve Windows için derliyorsunuz .
Cygwin Hakkında
Cygwin'in amacı, Unix tabanlı işletim sistemlerinin sağladığı ve POSIX standartlarına göre belgelenen küçük ayrıntıların çoğunu taklit ederek Unix tabanlı uygulamaları Windows'a taşımayı çok daha kolay hale getirmektir . Uygulamanız borular, Unix tarzı dosya ve dizin erişimi vb. Gibi Unix özelliğini kullanabilir ve uygulamanızın etrafında bir uyumluluk katmanı görevi görecek Cygwin ile derlenebilir , böylece bu Unix'e özgü paradigmaların çoğu kullanılmaya devam.
Yazılımınızı dağıtırken, alıcının Cygwin çalışma zamanı ortamı ile birlikte çalıştırması gerekir (dosya tarafından sağlanır) cygwin1.dll
) . Bunu yazılımınızla dağıtabilirsiniz, ancak yazılımınızın açık kaynak lisansına uyması gerekir. Hatta, sadece yazılımınızı onunla ilişkilendirmek, ancak dll'yi ayrı olarak dağıtmak bile, açık kaynak lisansını onurlandırmanızı gerektirebilir.
MinGW Hakkında
MinGW, GCC, Make, Bash vb.Gibi GNU derleyici araçlarının bir Windows bağlantı noktası olmayı amaçlamaktadır. Unix ile taklit etmeye veya kapsamlı uyumluluk sağlamaya çalışmaz, bunun yerine GCC'yi (GNU derleyici) ve Windows'ta az sayıda başka aracı kullanmak için gereken minimum ortamı sağlar.. Cygwin gibi bir Unix öykünme katmanı yoktur, ancak sonuç olarak, uygulamanızın Windows'ta çalışabilmesi için özel olarak programlanması gerekir; bu, standart bir Unix ortamında çalıştırılmak üzere oluşturulmuşsa önemli bir değişiklik anlamına gelebilir ve daha önce belirtilenler gibi Unix'e özgü özellikleri kullanır. Varsayılan olarak, MinGW'nin GCC'sinde derlenen kod, temelde GNU derleyici araçları paketini kullandığınızdan, doğru ayarlarla çapraz derlenebilmenize rağmen, .exe ve .dll dosyaları da dahil olmak üzere yerel bir Windows X86 hedefine derlenir.
MinGW aslında Microsoft Visual C ++ derleyicisine ve ilişkili bağlantı / marka araçlarına bir alternatiftir . Bazı durumlarda, Microsoft Visual C ++ ile, doğru kütüphanelerle ve bazı durumlarda diğer değişikliklerle derlenmesi amaçlanan bir şeyi derlemek için MinGW kullanmak mümkün olabilir.
MinGW, Windows işletim sistemiyle etkileşim kurmak için bazı temel standart kütüphaneleri içerir, ancak GNU derleyici koleksiyonunda bulunan normal standart kütüphanelerde olduğu gibi, bunlar oluşturduğunuz yazılımlara lisans kısıtlamaları getirmez.
Önemsiz yazılım uygulamaları için, kapsamlı bir platformlar arası çerçeve kullanmadığınız sürece bunları platformlar arası yapmak oldukça zor olabilir. Bunu yazdığım sırada Qt çerçevesi , bu amaç için en popüler olanlardan biriydi ve Windows dahil işletim sistemlerinde çalışan grafiksel uygulamaların oluşturulmasına izin verdi, ancak başka seçenekler de var. Başından beri böyle bir çerçeve kullanırsanız, baş ağrınızı yalnızca başka bir platforma geçme zamanı geldiğinde azaltmakla kalmaz, aynı zamanda bir grafik yazıyorsanız tüm grafiklerde aynı grafik widget'ları (pencereler, menüler ve kontroller) kullanabilirsiniz. GUI uygulaması ve kullanıcıya yerel görünmesini sağlayın.
Cygwin, Windows üzerinde eksiksiz bir UNIX / POSIX ortamı yaratma girişimidir. Bunu yapmak için çeşitli DLL'ler kullanır. Bu DLL dosyaları GPLv3 + kapsamında olsa da, lisansları türetilmiş bir çalışmayı GPLv3 + kapsamına girmeye zorlamayan bir istisna içerir . MinGW, bu tür DLL'lere bağımlı olmadan Windows yürütülebilir dosyaları oluşturmanıza izin veren bir C / C ++ derleyici paketidir - yalnızca normal Microsoft Windows kurulumunun bir parçası olan normal MSVC çalışma zamanlarına ihtiyacınız vardır.
Ayrıca MSYS adı verilen MinGW ile derlenmiş küçük bir UNIX / POSIX benzeri ortam elde edebilirsiniz . Cygwin'in tüm özelliklerine yakın bir yere sahip değildir, ancak MinGW kullanmak isteyen programcılar için idealdir.
Diğer yanıtlara eklemek için, Cygwin MinGW kütüphaneleri ve başlıkları ile birlikte gelir ve gcc ile -mno-cygwin bayrağı kullanarak cygwin1.dll dosyasına bağlanmadan derleyebilirsiniz. Ben çok düz MinGW ve MSYS kullanmayı tercih ederim.
gcc-3 -mno-cygwin
mingw64-x86_64-gcc-core
Cygwin paketini yükleyin . MinGW-64 daha sonra garip bir şekilde adlandırılmış x86_64-w64-mingw32-gcc
komut olarak kullanılabilir. Lütfen Tanrı (lar), birisi zaten bu kanlı şeylerin isimlerini birleştiriyor.
Wikipedia burada bir karşılaştırma yapıyor .
Cygwin web sitesinden :
- Cygwin, Windows için Linux benzeri bir ortamdır. İki bölümden oluşur: Önemli bir API API işlevselliği sağlayan bir Linux API öykünme katmanı olarak görev yapan bir DLL (cygwin1.dll).
- Linux görünümü ve hissi veren bir araç koleksiyonu.
Mingw web sitesinden :
MinGW ("Windows için Minimalistic GNU"), herhangi bir üçüncü taraf C çalışma zamanı DLL'lerine güvenmeyen yerel Windows programları üretmenize izin veren GNU araç kümeleriyle birlikte serbestçe kullanılabilir ve serbestçe dağıtılabilir Windows'a özgü başlık dosyaları ve içe aktarma kitaplıklarından oluşan bir koleksiyondur.
Cygwin, Windows'ta POSIX benzeri bir çalışma zamanı sağlamak için bir DLL, cygwin.dll (veya belki bir dizi DLL) kullanır.
MinGW yerel bir Win32 uygulaması için derler.
Cygwin ile bir şey oluşturursanız, yüklediğiniz herhangi bir sistemin Cygwin DLL (ler) ine de ihtiyacı olacaktır. Bir MinGW uygulaması için özel bir çalışma zamanı gerekmez.
Cygwin ve MinGW arasındaki farkı anlamak için cevaplanan bu soruları okuyun.
Soru # 1: Kaynak kodunu bir kez yazdığım, bir kez derlediğim ve herhangi bir platformda (örneğin Windows, Linux ve Mac OS X…) çalıştırdığım bir uygulama oluşturmak istiyorum.
Cevap # 1: Kaynak kodunuzu JAVA'ya yazın. Kaynak kodunu bir kez derleyin ve istediğiniz yerde çalıştırın.
Soru # 2: Kaynak kodunu bir kez yazdığım bir uygulama oluşturmak istiyorum, ancak kaynak kodunu herhangi bir platform için ayrı ayrı derlememde sorun yok (örn. Windows, Linux ve Mac OS X…).
Cevap 2: Kaynak kodunuzu C veya C ++ ile yazın. Yalnızca standart başlık dosyalarını kullanın. Herhangi bir platform için uygun bir derleyici kullanın (örn. Windows için Visual Studio, Linux için GCC ve Mac için XCode). Kaynak kodunuzu tüm platformlarda başarıyla derlemek için gelişmiş programlama özelliklerini kullanmamanız gerektiğini unutmayın. Hiçbir C veya C ++ standart sınıfı veya işlevi kullanmazsanız, kaynak kodunuz diğer platformlarda derlenmez.
Soru # 3: Soru # 2'nin cevabında, her platform için farklı derleyici kullanmak zordur, herhangi bir çapraz platform derleyicisi var mı?
Cevap # 3: Evet, GCC derleyicisini kullanın. Çapraz platform derleyicisidir. Windows'ta kaynak kodunuzu derlemek için, Windows için GCC derleyicisi sağlayan ve kaynak kodunuzu yerel Windows programına derleyen MinGW kullanın . Kaynak kodunuzu tüm platformlarda başarıyla derlemek için gelişmiş programlama özelliklerini (Windows API gibi) kullanmayın. Windows API işlevlerini kullanıyorsanız, kaynak kodunuz diğer platformlarda derlenmez.
Soru # 4: C veya C ++ standart başlık dosyaları çoklu iş parçacığı gibi gelişmiş programlama özellikleri sağlamaz. Ne yapabilirim?
Cevap # 4: POSIX (UNIX için Taşınabilir İşletim Sistemi Arayüzü) standardını kullanmalısınız. Birçok gelişmiş programlama özelliği ve aracı sağlar. Birçok işletim sistemi tamamen veya kısmen POSIX uyumlu (Mac OS X, Solaris, BSD / OS ve ... gibi). Bazı işletim sistemleri resmi olarak POSIX uyumlu olarak onaylanmamış olsa da, büyük oranda (Linux, FreeBSD, OpenSolaris ve ... gibi) uyumludur. Cygwin , Microsoft Windows için büyük ölçüde POSIX uyumlu bir geliştirme ve çalışma zamanı ortamı sağlar.
Böylece:
Bir C programının taşınması açısından, bunu anlamanın iyi bir yolu bir örnek almaktır:
#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;
}
Biz değiştirirseniz stat
için_stat
, biz Ayrıca MinGW ile bu programı derlemek ve Cygwin ile Microsoft Visual C ile bu programı derlemek olabilir.
Microsoft Visual C altında, program bir MSVC yeniden dağıtılabilir çalışma zamanı kitaplığına bağlanacaktır: mxvcrtnn.dll
burada nn
bazı sürüm soneki. Bu programı göndermek için bu DLL'i eklememiz gerekecek. DLL sağladığını _stat
, system
veprintf
. (Çalışma zamanını statik olarak bağlama seçeneğimiz de vardır.)
MinGW altında, program msvcrt.dll
, Windows'un bir parçası olan dahili, belgesiz, sürümlendirilmemiş bir kitaplığa ve uygulama kullanımının sınırlarına bağlı olacaktır. Bu kütüphane aslında Windows'un kendisi tarafından kullanılmak üzere MS Visual C'den yeniden dağıtılabilir çalışma zamanı kütüphanesinin bir çataldır.
Bunların her ikisinde de program benzer davranışlara sahip olacaktır:
stat
fonksiyon, örneğin oldukça sınırlı bilgi-hayır kullanışlı izinleri veya inode sayısını döndürür.c:file.txt
, sürücüyle ilişkili geçerli çalışma dizinine göre çözümlenir c:
.system
kullanan cmd.exe /c
harici komutu çalıştırmak için.Programı Cygwin altında da derleyebiliriz. MS Visual C tarafından kullanılan yeniden dağıtılabilir çalışma zamanı gibi, Cygwin programı Cygwin'in çalışma zamanı kitaplıklarına da bağlanır: cygwin1.dll
(Cygwin uygun) ve cyggcc_s-1.dll
(GCC çalışma zamanı desteği). Cygwin artık LGPL altında olduğundan, GPL uyumlu ücretsiz yazılım olmasa bile programımızla birlikte paketleyebilir ve programı gönderebiliriz.
Cygwin altında kütüphane işlevleri farklı davranacaktır:
stat
fonksiyon alanlarının çoğunda anlamlı değerler dönen, zengin işlevlere sahiptir.c:file.txt
hiç bir sürücü harf başvurusu içerdiği anlaşılamaz, çünkü c:
bunu bir eğik çizgi izlemez. Kolon adın bir parçası olarak kabul edilir ve bir şekilde ona karışır. Cygwin'deki bir birime veya sürücüye karşı göreceli bir yol, "şu anda kayıtlı sürücü" kavramı ve sürücü başına geçerli çalışma dizini yok.system
işlevi kullanmaya çalışır /bin/sh -c
tercüman. Cygwin /
yolu yürütülebilir dosyalarınızın konumuna göre çözer ve bir sh.exe
programın yürütülebilir dosyayla birlikte bulunmasını bekler .Hem Cygwin hem de MinGW, Win32 işlevlerini kullanmanıza izin verir. Aramak istiyorsanız MessageBox
veya CreateProcess
bunu yapabilirsiniz. gcc -mwindows
MinGW ve Cygwin altında konsol penceresi gerektirmeyen bir program da kolayca oluşturabilirsiniz .
Cygwin kesinlikle POSIX değildir. Windows API'sine erişim sağlamanın yanı sıra, bazı Microsoft C işlevleri (kendi içinde bulunan şeyler msvcrt.dll
veya yeniden dağıtılabilir msvcrtnn.dll
çalışma süreleri) için kendi uygulamalarını da sağlar . Bunun bir örneği spawn*
gibi işlevler ailesidir spawnvp
. Bunlar, kavramı olmayan Windows işlem oluşturma modeliyle daha iyi eşleştiklerinden Cygwin yerine fork
ve exec
üzerinde kullanmak için iyi bir fikirdir fork
.
Böylece:
Cygwin programları, kütüphanelerin eşlik etmesini gerektiren gerekçelerle MS Visual C programlarından daha az "doğal" değildir. Windows üzerinde programlama dili uygulamalarının kendi çalışma zamanlarını, hatta C dili uygulamalarını sağlamaları beklenir. Windows'ta genel kullanım için "libc" yoktur.
MinGW'nin üçüncü taraf DLL gerektirmemesi aslında bir dezavantajdır; Visual C çalışma zamanının belgelenmemiş, Windows iç çatalına bağlıdır. MinGW bunu yapar çünkü GPL sistem kütüphanesi istisnası geçerlidir msvcrt.dll
, bu da GPL-ed programlarının MinGW ile derlenip yeniden dağıtılabileceği anlamına gelir.
POSIX'e kıyasla çok daha geniş ve derin desteği msvcrt.dll
sayesinde Cygwin, POSIX programlarını taşımak için açık ara üstün bir ortam. Şu anda LGPL altında olduğundan, açık veya kapalı kaynaklı her türlü lisansa sahip uygulamaların yeniden dağıtılmasına izin veriyor. Cygwin termios
, Microsoft konsolu ile çalışan VT100 emülasyonu bile içeriyor ! Ham modu ayarlayan tcsetattr
ve imleci kontrol etmek için VT100 kodlarını kullanan bir POSIX uygulaması doğrudan cmd.exe
pencerede çalışır. Son kullanıcı söz konusu olduğunda, konsolu kontrol etmek için Win32 çağrıları yapan yerel bir konsol uygulamasıdır.
Ancak:
/bin/sh
ve diğer sorunlara bağımlılık gibi bazı tuhaflıklara sahiptir . Bu farklılıklar Cygwin programlarını "yerli olmayan" kılan şeydir. Bir program bağımsız değişken olarak bir yol alırsa veya bir iletişim kutusundan girdi alırsa, Windows kullanıcıları bu yolun diğer Windows programlarında olduğu gibi çalışmasını bekler. Eğer bu şekilde çalışmazsa, bu bir problemdir.Tak: LGPL duyurusundan kısa bir süre sonra, bu sorunları düzeltmeyi amaçlayan bir Cygwin DLL çatalı sağlamak için Cygnal (Cygwin Yerel Uygulama Kütüphanesi) projesini başlattım . Programlar Cygwin altında geliştirilebilir ve daha sonra Cygnal sürümüyle cygwin1.dll
derlenmeden dağıtılabilir . Bu kütüphane geliştikçe, MinGW ihtiyacını yavaş yavaş ortadan kaldıracaktır.
Cygnal yol işleme sorununu çözdüğünde, Cygnal ile bir Windows uygulaması olarak gönderildiğinde Windows yollarıyla çalışan ve Cygwin /usr/bin
altında yüklü olduğunda Cygwin yollarıyla sorunsuz çalışan tek bir yürütülebilir dosya geliştirmek mümkün olacaktır . Cygwin altında, yürütülebilir dosya şeffaf bir şekilde benzer bir yolla çalışacaktır /cygdrive/c/Users/bob
. Cygnal sürümüne bağlandığı yerel dağıtımda cygwin1.dll
, bu yol bir anlam ifade etmezken , anlayacaktır c:foo.txt
.
MinGW
1.3.3 sürümünden çatallanmıştırCygwin
. Her iki haldeCygwin
veMinGW
liman için kullanılabilirUNIX
yazılımWindows
, bunlar farklı yaklaşımlar vardır:Cygwin
amaçları tam sağlamak içinPOSIX layer
çeşitli sistem çağrıları ve mevcut kütüphanelerin emülasyonları sağladığınıLinux
,UNIX
veBSD
varyantları.POSIX layer
Üstünde çalıştığıWindows
gerektiğinde uyumluluk için performanstan ödün. Buna göre, bu yaklaşım , programın yanı sıra programla birlikte dağıtılması gereken copylefted bir uyumluluk kitaplığının üstünde çalışacakWindows
programların kullanılmasını gerektirir . doğrudan yoluyla yerel işlevsellik ve performans sağlamayı amaçlamaktadır . Aksine ,Cygwin
source code
MinGW
Windows API calls
Cygwin
MinGW
bir uyumluluk katmanı gerektirmezDLL
ve bu nedenle programların dağıtılması gerekmezsource code
.Çünkü
MinGW
bağımlıdırWindows API calls
, bir tam sağlayamazPOSIX API
; ile derlenebilecek bazılarınıUNIX applications
derleyemezCygwin
. Özellikle, bu gerektiren uygulamalar için geçerlidirPOSIX
gibi işlevsellikfork()
,mmap()
yaioctl()
bekliyoruz olanlar bir çalıştırılabilir vePOSIX environment
. Bir kullanarak yazılan uygulamalarcross-platform library
kendisi taşıdık edildiğiniMinGW
gibi, bu türSDL
,wxWidgets
,Qt
, veyaGTK+
içinde genellikle aynı kolaylıkla derlemek olacakMinGW
onlar yaptığınız gibiCygwin
.Kombinasyonu
MinGW
veMSYS
kayıt defterinde veya bilgisayardaki dosyalarda girişler bırakmadan çıkarılabilir medyaya yüklenebilen küçük, bağımsız bir ortam sağlar.Cygwin
Taşınabilir benzer bir özellik sağlar. Daha fazla işlevsellik sağlayarak,Cygwin
kurulumu ve bakımı daha karmaşık hale gelir.Bu da mümkündür
cross-compile Windows applications
ileMinGW-GCC under POSIX systems
. Bu, geliştiricilerin olmadanMSYS
çalışacak yazılımları derlemek için birlikte Windows kurulumuna ihtiyaç duymadığı anlamına gelir .Windows
Cygwin
Windows'ta Unix uygulamalarını derlemenize yardımcı olmak için tasarlanmış AT & T'nin U / Win yazılımını göz ardı etmeyin (son sürüm - 2012-08-06; Eclipse Public License, Version 1.0 kullanır).
Cygwin gibi bir kütüphaneye karşı koşmak zorundalar; onların durumunda POSIX.DLL
. AT & T çocuklar müthiş mühendis (ksh ve nokta getiren aynı grup ) ve onların şeyler kontrol değer.
CyGwin tüm POSIX ortamını taklit ederken, MinGW yalnızca derleme için minimal bir araç setidir (yerel Win uygulamasını derler.) Bu nedenle, projenizi çapraz platform haline getirmek istiyorsanız, ikisi arasındaki seçim açıktır, MinGW.
Windows'ta VS, Linux / Unices üzerinde GCC kullanmayı düşünebilirsiniz. Çoğu açık kaynaklı proje bunu yapar (örneğin, Firefox veya Python).
clang
geçerli bir platformlar arası çözüm.
Fayda davranışının gerçekten ikisi arasında değişebileceğini unutmayın.
Örneğin, Cygwin tar çatallanabilir - çünkü mingw sürümünün yapılamadığı fork () DLL'de desteklenir. Bu mysql kaynağından derlemeye çalışırken bir sorundur.
Cygwin'i ticari / tescilli / açık kaynaklı olmayan bir uygulamada kullanmak için Red Hat'tan bir " lisans satın alma " için on binlerce dolar ödemeniz gerekir ; bu, standart lisans koşullarını önemli bir maliyetle geçersiz kılar . Google "cygwin lisans maliyeti" ve ilk birkaç sonucu görün.
Mingw için böyle bir maliyet yoktur ve lisanslar (PD, BSD, MIT) son derece izin vericidir. En azından olabilir mingw64-TDM kullanılırken winpthreads gerekli lisanslama gibi, başvurunuzda lisans bilgilerini vermeniz beklenecektir.
Izzy Helianthus sayesinde EDIT: Cygwin'in winsup alt dizininde bulunan API kitaplığı artık tam GPL'nin aksine LGPL altında dağıtıldığından ticari lisans artık mevcut veya gerekli değil.
Cygwin, tam teşekküllü bir Linux benzeri platform sağlamak için tasarlanmış kapsamlı bir dizi araç da dahil olmak üzere Windows için az çok eksiksiz bir POSIX ortamı sağlamak üzere tasarlanmıştır. Buna karşılık, MinGW ve MSYS hafif, minimalist POSIX benzeri bir katman sağlar, sadece daha önemli araçlar gibi gcc
ve bash
kullanılabilir. MinGW'nin daha minimalist yaklaşımı nedeniyle, Cygwin'in sunduğu POSIX API kapsamı derecesini sağlamaz ve bu nedenle Cygwin'de derlenebilecek belirli programlar oluşturamaz.
İkisi tarafından üretilen kod açısından, Cygwin araç zinciri büyük bir çalışma zamanı kitaplığına dinamik bağlantı cygwin1.dll
kurmaya dayanırken, MinGW araç zinciri, kodu Windows yerel C kitaplığına dinamik olarak bağlanan ikili dosyalara msvcrt.dll
ve parçalarına statik olarak derler glibc
. Bu nedenle, Cygwin yürütülebilir dosyaları daha kompakttır, ancak ayrı bir yeniden dağıtılabilir DLL gerektirirken, MinGW ikili dosyaları bağımsız olarak gönderilebilir, ancak daha büyük olma eğilimindedir.
Cygwin tabanlı programların çalışması için ayrı bir DLL gerektirmesi de lisans kısıtlamalarına yol açar. Cygwin çalışma zamanı kitaplığı, OSI uyumlu lisanslara sahip uygulamalar için bağlantı istisnasıyla GPLv3 altında lisanslanmıştır, bu nedenle Cygwin etrafında kapalı kaynaklı bir uygulama oluşturmak isteyen geliştiricilerin Red Hat'tan ticari bir lisans almaları gerekir. Diğer yandan, MinGW kodu üstbilgiler ve kütüphaneler izinli olarak lisanslandığından hem açık kaynaklı hem de kapalı kaynaklı uygulamalarda kullanılabilir.
Cygwin , Microsoft Windows için Unix benzeri bir ortam ve komut satırı arabirimidir.
Mingw , GNU Compiler Collection'ın (GCC) Microsoft Windows'a yerel bir yazılım bağlantı noktası ve Windows API için serbestçe dağıtılabilir bir içe aktarma kitaplıkları ve başlık dosyaları kümesidir. MinGW, geliştiricilerin yerel Microsoft Windows uygulamaları oluşturmasına izin verir.
Gerekli tüm kitaplıkların (DLL) bulunması koşuluyla mingw
, cygwin
ortam olmadan oluşturulan ikili dosyaları çalıştırabilirsiniz .
Cygwin
bir uyumluluk katmanı kullanır, oysa MinGW
yereldir. Bu ana farklılıklardan biridir.