Cygwin ve MinGW arasındaki fark nedir?


657

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:


629

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.


43
MinGW ile gelen bash yerel bir Windows programı değildir. Cygwin DLL bir çatal olan MSYS DLL bağlıdır. MinGW / MSYS ile gelen diğer Unix yardımcı programlarının çoğu için aynıdır. MinGW gcc gerçekten de yerel bir program. Make, hem yerel sürümde hem de MSYS sürümünde kullanılabilir.
ak2

6
hız açısından herhangi bir fark var mı?
EKanadily

6
Hız farkı çoğu durumda göz ardı edilebilir . Herhangi bir fark, cygwin uyumluluk katmanı tarafından sağlanan ek soyutlama düzeyinin işleri ne kadar yavaşlattığına inecektir. G / Ç gibi şeyler üzerinde ölçülebilir bir etkisi olabilir. Örneğin, uzun zaman önce, Git yalnızca cygwin'de Windows üzerinde çalıştı ve bu nedenle biraz daha yavaştı. Daha sonra, bir çerçeve kullanarak kod yazarsanız, yine de bazı şeyleri yavaşlatma potansiyeline sahip bir soyutlama katmanıdır.
thomasrutter

28
Cygwin için derlenen kodun hala yerel kod olduğuna dikkat etmeliyim - Java gibi bir yorumlayıcıyla çalıştırılması gerekmez. Sadece disk / dosya gibi belirli işletim sistemi özellikleri ile etkileşime girmesi gerektiğinde başka bir katmandan geçer.
thomasrutter

4
Gnerally karşılaştıramazsınız, çünkü kodunuzu cygwin için olup olmamasına bağlı olarak farklı yazmanız gerekir. "Merhaba dünya" gibi küçük ve basit yazılımlar için cygwin eşdeğeri yalnızca cygwin çalışma zamanı kitaplığı nedeniyle daha büyük olacaktır. Cygwin çalışma zamanı kitaplığının boyutunu saymazsanız, cygwin sürümü genellikle daha küçük olacaktır, ancak bence bu yanlış bir rakamdır, çünkü kütüphane pratik olarak her zaman yazılımla birlikte sağlanmalıdır. Bununla birlikte, önemsiz olmayan kütüphaneler / çerçeveler kullanıyorsanız, daha fazla buna bağlı olacaktır.
thomasrutter

311

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.


59
Peki ücretsiz GPL olmayan yazılımı yayınlamak istersem? Üzgünüm, ben bir GPL hayranı değilim, hepsi bu.

19
@Dan MinGW'nin kullandığı çalışma zamanını yeniden dağıtmanıza gerek yoktur - bu Windows'un bir parçasıdır.

14
@ ak2: bu doğru, ama yanıltıcı. cygwyn gcc + cygwin ortamı varsayılan olarak (GPL) cygwin dll ile bağlantılı ikili dosyalar üretmektedir. mingw + msys varsayılan olarak platform C lib'sine bağlı ikili dosyalar üretmeye başlar.
Sean McMillan

4
@DanMoulding Microsoft hayranı değilseniz, öncelikle Windows için geliştirmek için bu duyguları göz ardı etmeniz gerekir. ;-)
Arda Xi

14
@anon "Ama ücretsiz GPL olmayan yazılımlar yayınlamak istiyorsam?" .. cygwin lisans koşullarında, diğer (GPL olmayan) açık kaynaklı lisanslar altında bağlantılı özgür yazılımları dağıtmanıza izin veren özel bir istisnadır. Burada "Açık Kaynak Lisans İstisnası" konusuna bakın: cygwin.com/licensing.html
steve cook

138

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.


31
Bu artık cygwin 1.7.6 ile çalışmaz. gcc: -mno-cygwin bayrağı kaldırıldı; bir mingw hedefli çapraz derleyici kullanın.
sigjuice

2
@sigjuice: true, ancak eski -mno-cygwin bayrağı hala GCC 3.x için çalışıyor:gcc-3 -mno-cygwin
Amro

1
Yani bu, bir cygwin sunucusundan bir mingw hedefine derlemek için mingw kütüphanelerini mingw'in resmi sitesinden indirmem gerektiği anlamına mı geliyor? Veya bu kütüphaneler Cygwin'in paket sisteminden indirilebilir mi?
CMCDragonkai

5
@CMCDragonkai mingw uyumlu derleyicileri Cygwin sitesinden kurulum yardımcı programını çalıştırarak ve bularak ve işaretleyerek alabilirsiniz. Bu nedenle gcc artık mingw uyumlu kod oluşturmasa da, Cygwin içinde mingw derleyicisinin msys altında çalıştırılabileceği türden bir yürütülebilir dosya yapmak için "mingw-gcc" (tam ad değil) çalıştırabilirsiniz.
cardiff space man

9
Cardiff'in yardımcı cevabını değiştirmek için Cygwin'in MinGW paketleri ve komutları biraz belirsiz isimlere sahip. MinGW-64'ü yüklemek için ( bu günlerde her zaman istediğiniz gibi ), mingw64-x86_64-gcc-coreCygwin paketini yükleyin . MinGW-64 daha sonra garip bir şekilde adlandırılmış x86_64-w64-mingw32-gcckomut olarak kullanılabilir. Lütfen Tanrı (lar), birisi zaten bu kanlı şeylerin isimlerini birleştiriyor.
Cecil Curry

60

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.


47

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.


42

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:

Windows'ta GCC çapraz platform derleyicisinin avantajını kullanmak için MinGW kullanın.

Windows'taki POSIX standart gelişmiş programlama özelliklerinden ve araçlarından yararlanmak için Cygwin kullanın.


4
Küçük SSS hakkında: 1) Hakkınız, herhangi bir yerde çalışan ve derlenmesi gerekmeyen bir şey gerekiyorsa, java gibi bir şey seçin (ayrıca python, perl, ruby ​​ve senaryo dillerinin geri kalanını da unutmayın) 2) Bu, C durumu için bir şekilde yanlıştır, çünkü C'nin tüm derleyicileri bunu çok iyi destekler. 3) Hala win32 api kullanabilirsiniz, ancak bir taşınabilirlik katmanına sarmanız gerekir, bu sadece bir tasarım problemidir.
Coyote21

1
4) Bu tamamen yanlıştır, çünkü yukarıda verdiğim nedenlerden dolayı, POSIX sadece başka bir API olduğundan, çok fazla POSIX'i savunursanız, Unices'in bile aynı POSIX setini uygulaması gerekmediğini bilmelisiniz, bu yüzden nasıl bununla başa çıkıyor musun Gerçek zamanlı POSIX api akla geliyor. Ve sonuç tamamen sahte ve yanlış yapar, çünkü Windows'ta herhangi bir şey için POSIX'e ihtiyacınız yoktur, sadece Win32 API'yi kullanabilirsiniz. Ya da Qt, GTK ve WxWidgets'ın platformlar arası olmanın bir yolunu nasıl bulduğunu düşünüyorsunuz, sanırım hepsinin pencerelerde cygwin kullanması gerekiyor. Cevabınız için -1 oy.
Coyote21

4
Argümanınızı anlamıyorum, @ Coyote21. POSIX'in platformlar arası geliştirme için uygun olmadığını mı söylüyorsunuz? Birden çok platform için C / C ++ 'da kod yazmanın tek uygun yolunun, desteklemek istediğiniz her platform için kendi uyumluluk katmanınızı yazmak olduğunu mu söylüyorsunuz? POSIX ile başlama önerisiyle ilgili yanlış bir şey görmüyorum. Size ne kadar uzağa gidebileceğini ve kapsamlı bir uyumluluk katmanı çözümünün gerekip gerekmediğini görmeniz gerekir. Geniş uyumluluk katmanları norm değildir. Aksini söylemek POSIX'in tam bir başarısızlık olduğunu iddia etmektir.
David Gladfelter

Çoklu okuma, MinGW'de bile POSIX katmanı üzerinden uygulanır.
Alexander Shishenko

1
"kaynak kodunuzu tüm platformlarda başarıyla derlemek için gelişmiş programlama özelliklerini kullanmamalısınız." "Gelişmiş programlama özellikleri" ile ne demek istediğinizi netleştirmeniz gerekiyor. Daha sonraki bir çizgiye dayanarak, tahminim aslında platforma özgü özellikler demek . Modern dil özellikleri demek istiyorsan, hayır, çünkü "tüm [büyük] platformlar" için yetkin derleyiciler var ve kendimizi sadece derleyicileri veya kütüphaneleri hala geride kalanları desteklemek için özelliklerden mahrum etmemeliyiz. İyi bir derleyici ile standart C / ++ ve çapraz platform kütüphaneler, biz olabilir bol gelişmiş.
underscore_d

34

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 statiç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.dllburada nnbazı sürüm soneki. Bu programı göndermek için bu DLL'i eklememiz gerekecek. DLL sağladığını _stat, systemveprintf . (Ç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:

  • statfonksiyon, örneğin oldukça sınırlı bilgi-hayır kullanışlı izinleri veya inode sayısını döndürür.
  • yol c:file.txt, sürücüyle ilişkili geçerli çalışma dizinine göre çözümlenir c:.
  • systemkullanan cmd.exe /charici 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:

  • statfonksiyon alanlarının çoğunda anlamlı değerler dönen, zengin işlevlere sahiptir.
  • yol c:file.txthiç 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.
  • systemişlevi kullanmaya çalışır /bin/sh -ctercüman. Cygwin /yolu yürütülebilir dosyalarınızın konumuna göre çözer ve bir sh.exeprogramı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 MessageBoxveya CreateProcessbunu yapabilirsiniz. gcc -mwindowsMinGW 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.dllveya 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 forkve 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.dllsayesinde 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 tcsetattrve imleci kontrol etmek için VT100 kodlarını kullanan bir POSIX uygulaması doğrudan cmd.exepencerede ç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:

  • Yerel bir Windows geliştirme aracı olarak Cygwin, Windows'a yabancı olan yol işleme, bazı sabit kodlanmış yollara /bin/shve 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.dllderlenmeden 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/binaltı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.


2
Mükemmel cevap. Her 3 ortamda aynı kod parçası derlendiğinde, bağlandığında ve yürütüldüğünde neler olduğunu göstermek anahtardır ve farklılıkları açıklığa kavuşturur.
drlolly

@Kaz Bu gelişme nasıl gidiyor? Kulağa doğru geliyor ama en az bir yıl öncesinden beri ölü gibi görünüyor. İnsanların yardım ve katılım için neden GitHub'ı kullanmıyorsunuz?
not2qubit

2
@ not2qubit Kendim kontrol ettiğim kendi sunucumda barındırıldıklarında projelerim üzerinde daha iyi kontrole sahip olduğumu hissediyorum. Git kullanıyorum; depo çekilebilir. Çekme isteklerini e-posta ile kabul edebilirim (Linus Torvalds tarafından tasarlandığı gibi). Ayrıca, idare düzeyinde katkıda bulunan birisine taahhüt ayrıcalıklarına sahip bir hesap verebilirim. Cygnal iyi çalışıyor; Düzenli olarak TXR dilinin yeni sürümlerinin Windows sürümlerinde paketliyorum. Cygnal'ı 2019'un başlarında daha yeni bir Cygwin taban çizgisine yeniden atacağım.
Kaz

@ not2qubit Cygnal gündemindeki 17 sorunun hepsinin de ele alındığını unutmayın. Hiç kimse yeni gereksinimler önermedi veya bu 17'lerin ele alınma şekli hakkında şikayet etmedi. bu yüzden çok acil olmayan yeni Cygwin'e yeniden basmak dışında bir gelişme gerekli değildir.
Kaz

27

Wikipedia diyor ki :

MinGW1.3.3 sürümünden çatallanmıştır Cygwin. Her iki halde Cygwin ve MinGWliman için kullanılabilir UNIXyazılım Windows, bunlar farklı yaklaşımlar vardır: Cygwinamaçları tam sağlamak için POSIX layer çeşitli sistem çağrıları ve mevcut kütüphanelerin emülasyonları sağladığını Linux, UNIXve BSDvaryantları. POSIX layer Üstünde çalıştığı Windowsgerektiğ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ışacak Windowsprogramların kullanılmasını gerektirir . doğrudan yoluyla yerel işlevsellik ve performans sağlamayı amaçlamaktadır . Aksine ,Cygwinsource codeMinGWWindows API callsCygwinMinGWbir uyumluluk katmanı gerektirmez DLLve bu nedenle programların dağıtılması gerekmez source code.

Çünkü MinGWbağımlıdır Windows API calls, bir tam sağlayamaz POSIX API; ile derlenebilecek bazılarını UNIX applicationsderleyemez Cygwin. Özellikle, bu gerektiren uygulamalar için geçerlidir POSIXgibi işlevsellik fork(), mmap()ya ioctl()bekliyoruz olanlar bir çalıştırılabilir ve POSIX environment. Bir kullanarak yazılan uygulamalar cross-platform librarykendisi taşıdık edildiğini MinGWgibi, bu tür SDL, wxWidgets, Qt, veya GTK+içinde genellikle aynı kolaylıkla derlemek olacak MinGWonlar yaptığınız gibi Cygwin.

Kombinasyonu MinGWve MSYSkayıt defterinde veya bilgisayardaki dosyalarda girişler bırakmadan çıkarılabilir medyaya yüklenebilen küçük, bağımsız bir ortam sağlar. CygwinTaşı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 applicationsile MinGW-GCC under POSIX systems. Bu, geliştiricilerin olmadan MSYSçalışacak yazılımları derlemek için birlikte Windows kurulumuna ihtiyaç duymadığı anlamına gelir .WindowsCygwin


2
Kesinlikle oluyor değil "daha kurmak ve korumak için karmaşık" ! Kullanım apt-cygdaha da kolay apt altında wsl kullanmaktan daha belki aynı derecede.
not2qubit

14

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.


4
Vay, bunlar kötü web sayfaları. Sonunda www2.research.att.com/sw/download adresinde bir indirme bağlantısı bulabildim , ancak proje hakkında çevrimiçi belge veya bilgi yok.
Fantius

1
Bilgiler yararlı olsa da, bunun bu soru yerine MingW veya Cygwin alternatifleri hakkındaki bir sorunun cevabı olabileceğini hissediyorum.
Vivek

12

Diğer cevaplar zaten hedefi vurdu. Sadece hızlıca yakalamak için bir örnek eklemek istiyorum.

resim açıklamasını buraya girin


11

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).


"Çoğu" burada anlamsız bir gelincik kelimesi gibi görünüyor, özellikle sadece 2 örnek ve istatistik yok. Birçok FOSS projesi bir jeton hareketi olarak bir VS proje dosyasına atıyor, daha doğru olduğundan şüpheleniyorum. Ancak geçmiş deneyimin geçmesi gereken bir şey varsa, VS, dil standartları geliştikçe önemli ölçüde geride kalma eğiliminde olduğu için GCC veya Clang genellikle daha güvenlidir.
underscore_d

Bu 2009'dan bir yanıt. Günümüzde GCC için işler daha da kasvetli görünüyor. "En" ne gelince, etki ile ölçüm yaparsanız, yalnızca Firefox ve Chrome'un diğer her şeyden daha fazla kullanıcısı vardır.
vartec

2
Yanıt verdiğimden bu yana değişen şey, şu anda clanggeçerli bir platformlar arası çözüm.
vartec

9

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.


Bu nedenle MSYS2 gibi tam teşekküllü MinGW özellikli ortamlar, bina sırasında gereken düşük seviyeli somunlar ve cıvatalar için bir Cygwin veya başka bir POSIX uyumlu katman sunar. Sonra gerçek derleme ve bağlantı tamamen doğal MinGW derleyicisine bırakılır. MSYS2 gerçekten temiz.
underscore_d

9

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.


2
Redhat web sitesinden bir güncelleme ("lisans satın alma" bağlantısı - '1 Mart 2016'dan itibaren Red Hat, Cygwin için ticari Satın Alma Lisansını satmamaktadır. Cygwin artık GNU Lesser altında dağıtıldığı için ticari lisans artık gerekli değildir GPL (LGPL). '> Cygwin Web Sitesinden Kaynak kodun winsup alt dizininde bulunan Cygwin ™ API kütüphanesi GNU Lesser General Public License (LGPL) sürüm 3 veya üstü tarafından kapsanır. LGPLv3, lütfen GNU Lesser Genel Kamu Lisansını (LGPL) okuyun
Izzy Helianthus

6

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 gccve bashkullanı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.dllkurmaya dayanırken, MinGW araç zinciri, kodu Windows yerel C kitaplığına dinamik olarak bağlanan ikili dosyalara msvcrt.dllve 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.


3

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, cygwinortam olmadan oluşturulan ikili dosyaları çalıştırabilirsiniz .


1

Cygwinbir uyumluluk katmanı kullanır, oysa MinGWyereldir. Bu ana farklılıklardan biridir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.