Apa perbedaan antara Cygwin dan MinGW?

658

Saya ingin membuat platform lintas proyek C ++, dan saya mempertimbangkan untuk menggunakan Cygwin / MinGW. Tetapi apa perbedaan di antara mereka?

Pertanyaan lain adalah apakah saya akan dapat menjalankan biner pada sistem tanpa Cygwin / MinGW?

Łukasz Lew
sumber

Jawaban:

629

Sebagai penyederhanaan, seperti ini:

  • Kompilasi sesuatu di Cygwin dan Anda mengompilasinya untuk Cygwin .

  • Kompilasi sesuatu di MinGW dan Anda mengompilasinya untuk Windows .

Tentang Cygwin

Tujuan Cygwin adalah membuat porting aplikasi berbasis Unix ke Windows jauh lebih mudah, dengan meniru banyak detail kecil yang disediakan sistem operasi berbasis Unix, dan didokumentasikan oleh standar POSIX . Aplikasi Anda dapat menggunakan fitur Unix seperti pipa, akses file-gaya Unix dan direktori, dan sebagainya, dan itu dapat dikompilasi dengan Cygwin yang akan bertindak sebagai lapisan kompatibilitas di sekitar aplikasi Anda, sehingga banyak dari paradigma Unix-spesifik dapat terus digunakan.

Saat Anda mendistribusikan perangkat lunak Anda, penerima harus menjalankannya bersama dengan lingkungan run-time Cygwin (disediakan oleh file cygwin1.dll). Anda dapat mendistribusikan ini dengan perangkat lunak Anda, tetapi perangkat lunak Anda harus mematuhi lisensi sumber terbuka. Bahkan mungkin terjadi bahwa bahkan hanya menghubungkan perangkat lunak Anda dengan itu, tetapi mendistribusikan dll secara terpisah, mungkin masih mengharuskan Anda untuk menghormati lisensi open source.

Tentang MinGW

MinGW bertujuan untuk menjadi port Windows dari alat-alat kompiler GNU, seperti GCC, Make, Bash, dan sebagainya. Itu tidak berusaha untuk meniru atau menyediakan kompatibilitas komprehensif dengan Unix, tetapi sebaliknya ia menyediakan lingkungan minimum yang diperlukan untuk menggunakan GCC (kompilator GNU) dan sejumlah kecil alat lain pada Windows. Itu tidak memiliki lapisan emulasi Unix seperti Cygwin, tetapi sebagai hasilnya aplikasi Anda perlu diprogram secara khusus untuk dapat berjalan di Windows, yang dapat berarti perubahan signifikan jika dibuat untuk mengandalkan dijalankan di lingkungan Unix standar dan menggunakan fitur khusus Unix seperti yang disebutkan sebelumnya. Secara default, kode yang dikompilasi dalam GCC MinGW akan dikompilasi ke target asli Windows X86, termasuk file .exe dan .dll, meskipun Anda juga dapat mengkompilasi silang dengan pengaturan yang tepat, karena pada dasarnya Anda menggunakan kompilator alat GNU.

MinGW pada dasarnya adalah alternatif untuk kompiler Microsoft Visual C ++ dan alat penghubung / pembuatan yang terkait. Dalam beberapa kasus dimungkinkan untuk menggunakan MinGW untuk mengkompilasi sesuatu yang dimaksudkan untuk dikompilasi dengan Microsoft Visual C ++, dengan perpustakaan yang tepat dan dalam beberapa kasus dengan modifikasi lainnya.

MinGW menyertakan beberapa pustaka standar dasar untuk berinteraksi dengan sistem operasi Windows, tetapi seperti pustaka standar normal yang termasuk dalam koleksi kompiler GNU, ini tidak memaksakan pembatasan lisensi pada perangkat lunak yang Anda buat.

Untuk aplikasi perangkat lunak non-sepele, membuatnya lintas-platform bisa menjadi tantangan besar kecuali jika Anda menggunakan kerangka kerja lintas-platform yang komprehensif. Pada saat saya menulis ini, kerangka kerja Qt adalah salah satu yang paling populer untuk tujuan ini, memungkinkan pembangunan aplikasi grafis yang bekerja lintas sistem operasi termasuk Windows, tetapi ada opsi lain juga. Jika Anda menggunakan kerangka kerja seperti itu sejak awal, Anda tidak hanya dapat mengurangi sakit kepala saat tiba saatnya untuk port ke platform lain, tetapi Anda dapat menggunakan widget grafis yang sama - jendela, menu dan kontrol - di semua platform jika Anda sedang menulis Aplikasi GUI, dan membuatnya tampak asli bagi pengguna.

thomasrutter
sumber
43
Bash yang datang dengan MinGW bukanlah program Windows asli. Itu tergantung pada DLL MSYS, yang merupakan garpu dari DLL Cygwin. Sama untuk banyak utilitas Unix lain yang datang dengan MinGW / MSYS. MinGW gcc memang merupakan program asli. Make tersedia dalam versi asli dan MSYS.
ak2
6
ada perbedaan dalam hal kecepatan?
EKanadily
6
Perbedaan kecepatan akan diabaikan dalam sebagian besar situasi. Perbedaan apa pun akan turun pada seberapa banyak tingkat tambahan abstraksi yang disediakan oleh lapisan kompatibilitas cygwin memperlambat segalanya. Ini mungkin memiliki efek terukur pada hal-hal seperti I / O. Misalnya, lama sekali, Git hanya berjalan di Windows di cygwin, dan karena itu agak lambat. Kemudian lagi, jika Anda menggunakan kode kerangka kerja, itu juga lapisan abstraksi dengan potensi untuk memperlambat beberapa hal.
thomasrutter
28
Saya harus mencatat bahwa kode yang dikompilasi untuk cygwin masih kode asli - itu tidak perlu dijalankan melalui seorang juru bahasa seperti katakanlah Java. Hanya saja ketika perlu berinteraksi dengan fitur OS tertentu seperti disk / file, ia akan melewati lapisan lain.
thomasrutter
4
Secara umum Anda tidak akan dapat membandingkan, karena Anda harus menulis kode secara berbeda tergantung pada apakah itu untuk cygwin atau tidak. Meskipun untuk perangkat lunak kecil dan sederhana seperti "hello world", padanan cygwin akan lebih besar hanya karena perpustakaan runtime cygwin. Jika Anda tidak menghitung ukuran runtime library cygwin versi cygwin biasanya akan lebih kecil tapi itu angka yang salah saya pikir karena perpustakaan praktis akan selalu perlu disertakan dengan perangkat lunak. Yang mengatakan, jika Anda menggunakan perpustakaan / kerangka kerja non-sepele maka itu akan lebih bergantung pada itu.
thomasrutter
311

Cygwin adalah upaya untuk menciptakan lingkungan UNIX / POSIX pada Windows. Untuk melakukan ini menggunakan berbagai DLL. Sementara DLL ini dicakup oleh GPLv3 +, lisensi mereka berisi pengecualian yang tidak memaksa karya turunan untuk dicakup oleh GPLv3 +. MinGW adalah suite kompiler C / C ++ yang memungkinkan Anda untuk membuat executable Windows tanpa ketergantungan pada DLL seperti itu - Anda hanya memerlukan runtime MSVC normal, yang merupakan bagian dari instalasi Microsoft Windows normal.

Anda juga bisa mendapatkan lingkungan seperti UNIX / POSIX kecil, dikompilasi dengan MinGW yang disebut MSYS . Itu tidak memiliki mendekati semua fitur Cygwin, tetapi sangat ideal untuk programmer yang ingin menggunakan MinGW.

Cole Johnson
sumber
59
Tetapi jika saya ingin merilis perangkat lunak non-GPL gratis? Maaf, saya bukan penggemar GPL, itu saja.
19
@Dan Anda tidak perlu mendistribusikan kembali runtime yang digunakan MinGW - itu bagian dari Windows.
14
@ ak2: itu benar, tetapi menyesatkan. cygwyn gcc + cygwin default untuk memproduksi binari yang terhubung dengan (GPL) cygwin dll. mingw + msys default untuk menghasilkan binari yang terhubung ke platform C lib.
Sean McMillan
4
@DanMoulding Jika Anda bukan penggemar Microsoft, Anda harus mengabaikan perasaan itu untuk mengembangkan untuk Windows. ;-)
Arda Xi
14
@anon "Tetapi jika saya ingin merilis perangkat lunak non-GPL gratis?" .. cygwin memiliki pengecualian khusus dalam persyaratan lisensinya yang memungkinkan Anda mendistribusikan perangkat lunak gratis yang dikaitkan dengannya di bawah lisensi sumber terbuka lainnya (non-GPL). Lihat "Pengecualian Lisensi Sumber Terbuka" di sini: cygwin.com/licensing.html
steve cook
138

Untuk menambah jawaban lain, Cygwin dilengkapi dengan pustaka dan header MinGW dan Anda dapat mengkompilasi tanpa menautkan ke cygwin1.dll dengan menggunakan flag -mno-cygwin dengan gcc. Saya sangat suka menggunakan MinGW dan MSYS.

TrayMan
sumber
31
Ini tidak berfungsi lagi dengan cygwin 1.7.6. gcc: Bendera -mno-cygwin telah dihapus; menggunakan kompilator silang bertarget mingw.
sigjuice
2
@ Sigjuice: benar, tetapi flag -mno-cygwin yang lama masih berfungsi untuk GCC 3.x:gcc-3 -mno-cygwin
Amro
1
Jadi apakah ini berarti saya perlu mengunduh perpustakaan mingw dari situs resmi mingw untuk mengkompilasi ke target mingw dari host cygwin? Atau bisakah perpustakaan ini diunduh dari sistem paket Cygwin?
CMCDragonkai
5
@ CMCDragonkai Anda dapat memperoleh kompiler mingw yang kompatibel dari situs Cygwin dengan menjalankan utilitas pengaturan dan menemukan serta mencentangnya. Jadi, meskipun gcc tidak lagi menghasilkan kode yang kompatibel dengan mingw, Anda dapat menggunakan Cygwin menjalankan "mingw-gcc" (itu bukan nama lengkap) untuk membuat jenis eksekusi yang sama dengan yang dilakukan oleh kompiler mingw di bawah msys.
Pria luar angkasa cardiff
9
Untuk mengubah balasan cardiff, paket dan perintah MinGW Cygwin memiliki nama yang agak tidak jelas. Untuk menginstal MinGW-64 ( hampir seperti yang selalu Anda inginkan, hari ini ), instal mingw64-x86_64-gcc-corepaket Cygwin. MinGW-64 kemudian akan tersedia sebagai perintah dengan nama canggung x86_64-w64-mingw32-gcc. Tolong Tuhan, seseorang sudah menyatukan nama-nama benda-benda berdarah ini.
Cecil Curry
60

Wikipedia melakukan perbandingan di sini .

Dari situs web Cygwin :

  • Cygwin adalah lingkungan seperti Linux untuk Windows. Ini terdiri dari dua bagian: A DLL (cygwin1.dll) yang bertindak sebagai lapisan emulasi Linux API menyediakan fungsionalitas Linux API substansial.
  • Kumpulan alat yang memberikan tampilan dan nuansa Linux.

Dari situs web Mingw :

MinGW ("GNU Minimalis untuk Windows") adalah kumpulan file header Windows spesifik yang tersedia secara bebas dan terdistribusi dan mengimpor pustaka yang dikombinasikan dengan tool GNU yang memungkinkan seseorang untuk menghasilkan program Windows asli yang tidak bergantung pada DLL runtime C pihak ketiga mana pun

secara langsung
sumber
47

Cygwin menggunakan DLL, cygwin.dll, (atau mungkin satu set DLL) untuk menyediakan runtime mirip POSIX pada Windows.

MinGW mengkompilasi ke aplikasi Win32 asli.

Jika Anda membangun sesuatu dengan Cygwin, sistem apa pun yang Anda instal juga memerlukan Cygwin DLL. Aplikasi MinGW tidak memerlukan runtime khusus.

Michael Burr
sumber
42

Baca pertanyaan-pertanyaan yang dijawab ini untuk memahami perbedaan antara Cygwin dan MinGW.


Pertanyaan # 1: Saya ingin membuat aplikasi yang saya tulis kode sumber sekali, kompilasi sekali dan jalankan di platform apa saja (misalnya Windows, Linux dan Mac OS X ...).

Jawaban # 1: Tulis kode sumber Anda di JAWA. Kompilasi kode sumber sekali dan jalankan di mana saja.


Pertanyaan # 2: Saya ingin membuat aplikasi yang saya tulis kode sumber sekali tetapi tidak ada masalah yang saya kompilasi kode sumber untuk platform apa pun secara terpisah (misalnya Windows, Linux dan Mac OS X ...).

Jawaban # 2: Tulis kode sumber Anda dalam C atau C ++. Gunakan file header standar saja. Gunakan kompiler yang sesuai untuk platform apa pun (mis. Visual Studio untuk Windows, GCC untuk Linux dan XCode untuk Mac). Perhatikan bahwa Anda tidak boleh menggunakan fitur pemrograman tingkat lanjut untuk mengkompilasi kode sumber Anda di semua platform dengan sukses. Jika Anda tidak menggunakan kelas atau fungsi standar C atau C ++, kode sumber Anda tidak dapat dikompilasi di platform lain.


Pertanyaan # 3: Dalam menjawab pertanyaan # 2, sulit menggunakan kompiler berbeda untuk setiap platform, apakah ada kompiler lintas platform?

Jawaban # 3: Ya, Gunakan kompiler GCC. Ini adalah kompiler lintas platform. Untuk mengkompilasi kode sumber Anda di Windows gunakan MinGW yang menyediakan kompiler GCC untuk Windows dan mengkompilasi kode sumber Anda ke program Windows asli. Jangan gunakan fitur pemrograman tingkat lanjut (seperti Windows API) untuk mengkompilasi kode sumber Anda di semua platform dengan sukses. Jika Anda menggunakan fungsi Windows API, kode sumber Anda tidak dapat dikompilasi di platform lain.


Pertanyaan # 4: File header standar C atau C ++ tidak menyediakan fitur pemrograman tingkat lanjut seperti multi-threading. Apa yang dapat saya?

Jawaban # 4: Anda harus menggunakan standar POSIX (Portable Operating System Interface [for UNIX]). Ini menyediakan banyak fitur dan alat pemrograman canggih. Banyak sistem operasi yang kompatibel sebagian atau sebagian POSIX (seperti Mac OS X, Solaris, BSD / OS dan ...). Beberapa sistem operasi sementara tidak secara resmi disertifikasi sebagai POSIX kompatibel, sesuai sebagian besar (seperti Linux, FreeBSD, OpenSolaris dan ...). Cygwin menyediakan sebagian besar pengembangan POSIX-compliant dan lingkungan untuk Microsoft Windows.


Jadi:

Untuk menggunakan keunggulan kompiler lintas platform GCC di Windows, gunakan MinGW.

Untuk menggunakan keunggulan fitur pemrograman POSIX standar dan alat di Windows, gunakan Cygwin.

Amir Saniyan
sumber
4
Tentang faq kecil Anda: 1) Hak Anda, jika Anda memerlukan sesuatu yang berjalan di mana saja dan tidak perlu dikompilasi, pilih sesuatu seperti java (juga jangan lupa python, perl, ruby ​​dan sisa bahasa skrip) 2) Ini agak salah untuk kasus C, karena semua kompiler C, mendukungnya dengan sangat baik. 3) Anda masih dapat menggunakan api win32, tetapi Anda harus membungkusnya dalam lapisan portabilitas, sehingga itu hanya masalah desain.
Coyote21
1
4) Ini benar-benar salah, karena alasan yang saya berikan di atas, karena POSIX hanyalah api lain, juga jika Anda mempertahankan begitu banyak POSIX, Anda harus tahu bahwa bahkan Unix tidak perlu mengimplementasikan set POSIX yang sama, jadi bagaimana caranya apakah kamu berurusan dengan itu Api POSIX real time muncul di pikiran. Dan itu membuat kesimpulan Anda benar-benar palsu dan salah, karena Anda tidak perlu POSIX untuk apa pun di windows, Anda bisa menggunakan Win32 API. Atau bagaimana menurut Anda bahwa Qt, GTK dan WxWidgets telah menemukan cara untuk menjadi cross-platform, saya kira mereka semua harus menggunakan cygwin di windows. -1 suara untuk jawaban Anda.
Coyote21
4
Saya tidak mengerti argumen Anda, @ Coyote21. Apakah Anda mengatakan bahwa POSIX tidak cocok untuk pengembangan lintas platform? Apakah Anda mengatakan bahwa satu-satunya cara yang tepat untuk menulis kode dalam C / C ++ untuk beberapa platform adalah dengan menulis layer kompatibilitas Anda sendiri untuk setiap platform yang ingin Anda dukung? Saya tidak melihat ada yang salah dengan saran untuk memulai dengan POSIX. Anda perlu melihat seberapa jauh itu dapat mencapai Anda dan apakah solusi lapisan kompatibilitas luas akan diperlukan. Lapisan kompatibilitas besar bukan norma. Mengatakan sebaliknya berarti menyatakan bahwa POSIX adalah kegagalan total.
David Gladfelter
Multithreading diimplementasikan melalui lapisan POSIX bahkan di MinGW.
Alexander Shishenko
1
"Anda seharusnya tidak menggunakan fitur pemrograman tingkat lanjut untuk mengkompilasi kode sumber Anda di semua platform dengan sukses." Anda benar-benar perlu mengklarifikasi apa yang Anda maksud dengan "fitur pemrograman tingkat lanjut". Berdasarkan baris selanjutnya, tebakan saya maksud Anda sebenarnya adalah fitur platform khusus . Jika Anda memaksudkan fitur bahasa modern, maka tidak, karena kompiler yang kompeten ada untuk "semua platform [utama]", dan kami tidak boleh mencabut fitur dari diri kami hanya untuk menopang mereka yang kompiler atau perpustakaannya masih tertinggal. Dengan compiler yang layak, standar C / ++, dan perpustakaan cross-platform, kita bisa banyak canggih.
underscore_d
34

Dari sudut pandang porting program C, cara yang baik untuk memahami ini adalah dengan mengambil contoh:

#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;
}

Jika kita beralih statke _stat, kita dapat mengkompilasi program ini dengan Microsoft Visual C. Kita juga dapat mengkompilasi program ini dengan MinGW, dan dengan Cygwin.

Di bawah Microsoft Visual C, program ini akan ditautkan ke perpustakaan run-time MSVC redistributable:, di mxvcrtnn.dllmana nnada beberapa versi suffix. Untuk mengirimkan program ini, kami harus menyertakan DLL itu. DLL menyediakan _stat, systemdan printf. (Kami juga memiliki opsi untuk menghubungkan secara statis run-time.)

Di bawah MinGW, program ini akan ditautkan ke msvcrt.dll, yang merupakan perpustakaan internal, tidak berdokumen, tidak berversi yang merupakan bagian dari Windows, dan terlarang untuk penggunaan aplikasi. Pustaka itu pada dasarnya adalah garpu dari run-time library yang dapat didistribusikan dari MS Visual C untuk digunakan oleh Windows itu sendiri.

Di bawah kedua hal ini, program akan memiliki perilaku yang serupa:

  • yang statfungsi akan kembali informasi-ada sangat terbatas perizinan berguna atau nomor inode, misalnya.
  • lintasan c:file.txtdiselesaikan sesuai dengan direktori kerja saat ini terkait dengan drive c:.
  • systemdigunakan cmd.exe /cuntuk menjalankan perintah eksternal.

Kami juga dapat mengkompilasi program di bawah Cygwin. Demikian pula dengan run-time redistributable yang digunakan oleh MS Visual C, program Cygwin akan dihubungkan ke pustaka run-time cygwin1.dllCygwin : (Cygwin proper) dan cyggcc_s-1.dll(dukungan run-time GCC). Karena Cygwin sekarang berada di bawah LGPL, kami dapat membuat paket dengan program kami, meskipun itu bukan perangkat lunak bebas yang kompatibel dengan GPL, dan mengirimkan program tersebut.

Di bawah Cygwin, fungsi perpustakaan akan berperilaku berbeda:

  • yang statfungsi memiliki fungsionalitas yang kaya, kembali nilai-nilai yang berarti di sebagian besar bidang.
  • jalan c:file.txtsama sekali tidak dipahami sebagai berisi referensi huruf drive, karena c:tidak diikuti oleh garis miring. Usus besar dianggap sebagai bagian dari nama dan entah bagaimana terkoyak ke dalamnya. Tidak ada konsep jalur relatif terhadap volume atau drive di Cygwin, tidak ada konsep "drive yang saat ini dicatat", dan tidak ada direktori kerja saat ini per-drive.
  • yang systemfungsi mencoba untuk menggunakan /bin/sh -cpenerjemah. Cygwin akan menyelesaikan /jalur sesuai dengan lokasi executable Anda, dan mengharapkan sh.exeprogram untuk ditempatkan bersama dengan executable Anda.

Baik Cygwin dan MinGW memungkinkan Anda untuk menggunakan fungsi Win32. Jika Anda ingin menelepon MessageBoxatau CreateProcess, Anda dapat melakukannya. Anda juga dapat dengan mudah membangun program yang tidak memerlukan jendela konsol, menggunakan gcc -mwindows, di bawah MinGW dan Cygwin.

Cygwin tidak sepenuhnya POSIX. Selain menyediakan akses ke Windows API, ia juga menyediakan implementasi sendiri dari beberapa fungsi Microsoft C (hal-hal yang ditemukan di msvcrt.dllatau msvcrtnn.dllrun-times yang dapat didistribusikan kembali ). Contoh dari ini adalah spawn*keluarga fungsi seperti spawnvp. Ini adalah ide yang baik untuk digunakan daripada forkdan execpada Cygwin karena mereka memetakan lebih baik untuk model pembuatan proses Windows yang tidak memiliki konsep fork.

Jadi:

  • Program Cygwin tidak kurang "asli" dari program MS Visual C dengan alasan membutuhkan pendampingan perpustakaan. Pemrograman implementasi bahasa pada Windows diharapkan memberikan waktu run-nya sendiri, bahkan implementasi bahasa C. Tidak ada "libc" di Windows untuk penggunaan umum.

  • Fakta bahwa MinGW tidak membutuhkan DLL pihak ketiga sebenarnya merupakan kerugian; itu tergantung pada garpu internal Windows yang tidak berdokumen dari Visual C run-time. MinGW melakukan ini karena pengecualian pustaka sistem GPL berlaku untuk msvcrt.dll, yang berarti bahwa program GPL-ed dapat dikompilasi dan didistribusikan kembali dengan MinGW.

  • Karena dukungannya yang lebih luas dan lebih dalam untuk POSIX dibandingkan msvcrt.dll, Cygwin sejauh ini merupakan lingkungan yang unggul untuk porting program POSIX. Karena sekarang di bawah LGPL, itu memungkinkan aplikasi dengan segala macam lisensi, sumber terbuka atau tertutup, untuk didistribusikan kembali. Cygwin bahkan mengandung emulasi VT100 dan termios, yang bekerja dengan konsol Microsoft! Aplikasi POSIX yang mengatur mode mentah dengan tcsetattrdan menggunakan kode VT100 untuk mengontrol kursor akan bekerja tepat di cmd.exejendela. Sejauh menyangkut pengguna akhir, itu adalah aplikasi konsol asli yang membuat panggilan Win32 untuk mengontrol konsol.

Namun:

  • Sebagai alat pengembangan Windows asli, Cygwin memiliki beberapa keanehan, seperti penanganan jalur yang asing bagi Windows, ketergantungan pada beberapa jalur berkode keras seperti /bin/shdan masalah lainnya. Perbedaan-perbedaan inilah yang menjadikan program Cygwin "non-pribumi". Jika suatu program mengambil jalur sebagai argumen, atau masukan dari kotak dialog, pengguna Windows berharap jalur itu bekerja dengan cara yang sama seperti di program Windows lainnya. Jika tidak bekerja seperti itu, itu masalah.

Pasang: Tidak lama setelah pengumuman LGPL, saya memulai proyek Cygnal (Cygwin Native Application Library) untuk menyediakan garpu Cygwin DLL yang bertujuan untuk memperbaiki masalah ini. Program dapat dikembangkan di bawah Cygwin, dan kemudian digunakan dengan versi Cygnal cygwin1.dlltanpa kompilasi ulang. Seiring membaiknya perpustakaan ini, secara bertahap akan menghilangkan kebutuhan akan MinGW.

Ketika Cygnal memecahkan masalah penanganan jalur, dimungkinkan untuk mengembangkan satu executable yang bekerja dengan jalur Windows saat dikirim sebagai aplikasi Windows dengan Cygnal, dan bekerja dengan mulus dengan jalur Cygwin saat dipasang di /usr/binbawah Cygwin Anda. Di bawah Cygwin, executable akan bekerja secara transparan dengan path seperti /cygdrive/c/Users/bob. Dalam penyebaran asli di mana ia terhubung dengan versi Cygnal cygwin1.dll, jalan itu tidak masuk akal, sedangkan itu akan mengerti c:foo.txt.

Kaz
sumber
2
Jawaban yang sangat bagus. Menampilkan apa yang terjadi ketika potongan kode yang sama dikompilasi, dihubungkan dan dieksekusi di masing-masing 3 lingkungan adalah kunci dan menjelaskan perbedaannya.
drlolly
@ Ka Bagaimana perkembangan itu terjadi? Kedengarannya menarik tetapi tampaknya sudah mati sejak setidaknya satu tahun yang lalu. Mengapa Anda tidak menggunakan GitHub agar orang dapat membantu dan berpartisipasi?
not2qubit
2
@ not2qubit Saya merasa saya memiliki kontrol yang lebih baik atas proyek saya ketika mereka di-host di server saya sendiri yang saya kendalikan sendiri. Saya menggunakan git; repositori dapat ditarik. Saya dapat menerima permintaan tarik melalui email (seperti yang dirancang oleh Linus Torvalds). Saya juga dapat memberikan akun dengan hak istimewa berkomitmen kepada seseorang yang menjadi kontributor tingkat pengelola. Cygnal bekerja dengan baik; Saya secara teratur menggabungkannya dalam versi Windows rilis baru dari bahasa TXR. Saya akan mengubah Cygnal ke baseline Cygwin yang lebih baru sekitar awal 2019.
Kaz
@ not2qubit Perhatikan bahwa semua 17 masalah dalam agenda Cygnal telah ditangani. Tidak ada yang menyarankan persyaratan baru, atau mengeluh tentang cara mereka ditangani. jadi tidak diperlukan pengembangan selain rebasing ke Cygwin yang lebih baru, yang tidak terlalu mendesak.
Kaz
27

Wikipedia mengatakan :

MinGWbercabang dari versi 1.3.3 dari Cygwin. Meskipun kedua Cygwin dan MinGWdapat digunakan untuk pelabuhan UNIXperangkat lunak untuk Windows, mereka memiliki pendekatan yang berbeda: Cygwinbertujuan untuk memberikan lengkap POSIX layer yang menyediakan emulasi dari beberapa panggilan sistem dan perpustakaan yang ada di Linux, UNIX, dan BSDvarian. The POSIX layer berjalan di atas Windows, mengorbankan kinerja di mana diperlukan untuk kompatibilitas. Karenanya, pendekatan ini memerlukan Windowsprogram yang ditulis dengan Cygwinuntuk dijalankan di atas pustaka kompatibilitas copyleft yang harus didistribusikan bersama program, bersama dengan programnya source code. MinGWbertujuan untuk menyediakan fungsionalitas dan kinerja asli melalui langsung Windows API calls. Tidak seperti Cygwin,MinGWtidak memerlukan lapisan kompatibilitas DLLdan karenanya program tidak perlu didistribusikan bersama source code.

Karena MinGWbergantung pada Windows API calls, itu tidak dapat memberikan penuh POSIX API; tidak dapat mengkompilasi beberapa UNIX applicationsyang dapat dikompilasi Cygwin. Secara khusus, ini berlaku untuk aplikasi yang memerlukan POSIXfungsionalitas seperti fork(), mmap()atau ioctl()dan mereka yang berharap untuk dijalankan di POSIX environment. Aplikasi yang ditulis menggunakan cross-platform libraryyang itu sendiri telah porting ke MinGW, seperti SDL, wxWidgets, Qt, atau GTK+, biasanya akan mengkompilasi dengan mudah di MinGWsaat mereka akan di Cygwin.

Kombinasi MinGWdan MSYSmenyediakan lingkungan kecil yang mandiri yang dapat dimuat ke media yang dapat dilepas tanpa meninggalkan entri dalam registri atau file di komputer. CygwinPortable menyediakan fitur serupa. Dengan menyediakan lebih banyak fungsi, Cygwin menjadi lebih rumit untuk dipasang dan dirawat.

Mungkin juga cross-compile Windows applicationsdengan MinGW-GCC under POSIX systems. Ini berarti bahwa pengembang tidak memerlukan instalasi Windows MSYSuntuk mengkompilasi perangkat lunak yang akan berjalan Windowstanpa Cygwin.

PersianGulf
sumber
2
Jelas bukan "lebih rumit untuk menginstal dan memelihara" ! Gunakan apt-cygkarena mungkin bahkan lebih mudah daripada menggunakan apt di bawah WSL.
not2qubit
14

Jangan mengabaikan perangkat lunak U / Win AT&T , yang dirancang untuk membantu Anda mengkompilasi aplikasi Unix di windows (versi terakhir - 2012-08-06; menggunakan Eclipse Public License, Versi 1.0).

Seperti Cygwin, mereka harus berlari melawan perpustakaan; dalam kasus mereka POSIX.DLL. Kawan-kawan AT&T adalah insinyur hebat (grup yang sama yang membawakan Anda ksh dan dot ) dan barang-barang mereka patut dicoba.

Norman Ramsey
sumber
4
Wow, itu beberapa halaman web yang buruk. Saya akhirnya dapat menemukan tautan unduhan di www2.research.att.com/sw/download , tetapi tidak ada dokumentasi atau informasi online tentang proyek tersebut.
Fantius
1
Meskipun informasi ini bermanfaat, saya merasa ini bisa menjadi jawaban untuk pertanyaan tentang alternatif untuk MingW atau Cygwin daripada pertanyaan ini.
Vivek
12

Jawaban lain sudah mengenai target. Saya hanya ingin menambahkan ilustrasi untuk tangkapan cepat.

masukkan deskripsi gambar di sini

smwikipedia
sumber
11

Cygwin mengemulasi seluruh lingkungan POSIX, sementara MinGW adalah tool minimal yang ditetapkan hanya untuk kompilasi (mengkompilasi aplikasi Win asli.) Jadi, jika Anda ingin membuat proyek lintas-platform Anda pilihan di antara keduanya jelas, MinGW.

Meskipun Anda mungkin mempertimbangkan untuk menggunakan VS pada Windows, GCC di Linux / Unices. Sebagian besar proyek open source melakukan itu (mis. Firefox atau Python).

vartec
sumber
"Kebanyakan" sepertinya kata musang yang tidak berarti di sini, terutama dengan hanya 2 contoh dan tidak ada statistik. Banyak proyek FOSS melempar file proyek VS sebagai isyarat, saya kira lebih akurat. Tetapi jika pengalaman masa lalu adalah sesuatu untuk dilalui, GCC atau Dentang biasanya lebih aman karena VS cenderung jauh tertinggal karena standar bahasa berkembang.
underscore_d
Itu jawaban dari 2009. Saat ini keadaan terlihat lebih suram untuk GCC. Adapun "sebagian besar", jika Anda mengukur berdasarkan dampak, maka hanya Firefox dan Chrome saja yang memiliki lebih banyak pengguna daripada yang lainnya.
vartec
2
Apa yang telah berubah sejak ketika saya menjawab adalah bahwa sekarang clangadalah solusi lintas-platform yang layak.
vartec
9

Perhatikan bahwa perilaku utilitas benar-benar dapat bervariasi di antara keduanya.

Misalnya, Cygwin tar dapat melakukan fork - karena fork () didukung di DLL - di mana versi mingw tidak bisa. Ini adalah masalah ketika mencoba mengkompilasi mysql dari sumber.


sumber
Inilah sebabnya mengapa lingkungan yang mampu sepenuhnya MinGW, misalnya MSYS2, menawarkan Cygwin atau lapisan yang sepenuhnya kompatibel dengan POSIX untuk mur dan baut tingkat rendah dari rangkaian alat yang diperlukan selama membangun. Kemudian kompilasi dan penautan aktual diserahkan ke kompiler MinGW yang sepenuhnya asli. MSYS2 sangat rapi.
underscore_d
9

Untuk menggunakan Cygwin dalam aplikasi komersial / kepemilikan / non-open-source, Anda harus membayar puluhan ribu dolar untuk " pembelian lisensi " dari Red Hat; ini membatalkan persyaratan lisensi standar dengan biaya yang cukup besar. Google "biaya lisensi cygwin" dan lihat beberapa hasil pertama.

Untuk mingw, tidak ada biaya yang dikeluarkan, dan lisensi (PD, BSD, MIT) sangat permisif. Paling-paling Anda mungkin diharapkan untuk memberikan rincian lisensi dengan aplikasi Anda, seperti lisensi winpthreads yang diperlukan saat menggunakan mingw64-tdm.

EDIT terima kasih kepada Izzy Helianthus: Lisensi komersial tidak lagi tersedia atau diperlukan karena perpustakaan API yang ditemukan di subdirektori winup dari Cygwin sekarang didistribusikan di bawah LGPL, sebagai lawan dari GPL lengkap.

Insinyur
sumber
2
Pembaruan dari situs web Redhat (tautan dari "pembelian lisensi" - 'Per 1 Maret 2016 Red Hat tidak lagi menjual Lisensi Pembelian komersial untuk Cygwin. Lisensi komersial tidak lagi diperlukan karena Cygwin sekarang sedang didistribusikan di bawah GNU Lesser GPL (LGPL). '> Dari Situs Web Cygwin. Perpustakaan API Cygwin ™ yang ditemukan di subdirektori winup dari kode sumber dicakup oleh Lisensi Publik Umum (LGPL) GNU versi 3 atau lebih baru. Untuk perincian persyaratan LGPLv3, silakan baca GNU Lesser General Public License (LGPL)
Izzy Helianthus
6

Cygwin dirancang untuk menyediakan lingkungan POSIX yang lebih atau kurang lengkap untuk Windows, termasuk seperangkat alat luas yang dirancang untuk menyediakan platform Linux-like lengkap. Sebagai perbandingan, MinGW dan MSYS menyediakan lapisan POSIX yang ringan dan minimalis, hanya dengan alat yang lebih penting seperti gccdan bashtersedia. Karena pendekatan MinGW yang lebih minimalis, ia tidak memberikan tingkat cakupan API POSIX yang ditawarkan Cygwin, dan karenanya tidak dapat membangun program tertentu yang dapat dikompilasi di Cygwin.

Dalam hal kode yang dihasilkan oleh keduanya, toolchain Cygwin bergantung pada penghubungan dinamis ke pustaka runtime besar cygwin1.dll,, sedangkan toolchain MinGW mengkompilasi kode ke biner yang menghubungkan secara dinamis ke pustaka Windows C asli msvcrt.dllserta secara statis ke beberapa bagian glibc. Karena itu, executable Cygwin lebih kompak tetapi membutuhkan DLL yang dapat didistribusikan kembali, sementara biner MinGW dapat dikirimkan secara mandiri tetapi cenderung lebih besar.

Fakta bahwa program berbasis Cygwin memerlukan DLL terpisah untuk dijalankan juga mengarah pada pembatasan lisensi. Pustaka runtime Cygwin dilisensikan di bawah GPLv3 dengan pengecualian tautan untuk aplikasi dengan lisensi yang sesuai dengan OSI, sehingga pengembang yang ingin membangun aplikasi sumber tertutup di sekitar Cygwin harus mendapatkan lisensi komersial dari Red Hat. Di sisi lain, kode MinGW dapat digunakan dalam aplikasi open-source dan closed-source, karena header dan pustaka dilisensikan secara permisif.

bwDraco
sumber
3

Cygwin adalah lingkungan Unix-like dan antarmuka baris perintah untuk Microsoft Windows.

Mingw adalah port perangkat lunak asli dari GNU Compiler Collection (GCC) ke Microsoft Windows, bersama dengan serangkaian pustaka impor dan file header yang dapat didistribusikan secara bebas untuk API Windows. MinGW memungkinkan pengembang untuk membuat aplikasi Microsoft Windows asli.

Anda dapat menjalankan binari yang dihasilkan mingwtanpa cygwinlingkungan, asalkan semua pustaka yang diperlukan (DLL) ada.

Gimel
sumber
1

Cygwinmenggunakan lapisan kompatibilitas, sedangkan MinGWasli. Itulah salah satu perbedaan utama.

pengguna3362761
sumber