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?
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.
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.
sumber
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.
sumber
gcc-3 -mno-cygwin
mingw64-x86_64-gcc-core
paket Cygwin. MinGW-64 kemudian akan tersedia sebagai perintah dengan nama canggungx86_64-w64-mingw32-gcc
. Tolong Tuhan, seseorang sudah menyatukan nama-nama benda-benda berdarah ini.Wikipedia melakukan perbandingan di sini .
Dari situs web Cygwin :
Dari situs web Mingw :
sumber
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.
sumber
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 ...).
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 ...).
Pertanyaan # 3: Dalam menjawab pertanyaan # 2, sulit menggunakan kompiler berbeda untuk setiap platform, apakah ada kompiler lintas platform?
Pertanyaan # 4: File header standar C atau C ++ tidak menyediakan fitur pemrograman tingkat lanjut seperti multi-threading. Apa yang dapat saya?
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.
sumber
Dari sudut pandang porting program C, cara yang baik untuk memahami ini adalah dengan mengambil contoh:
Jika kita beralih
stat
ke_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.dll
manann
ada beberapa versi suffix. Untuk mengirimkan program ini, kami harus menyertakan DLL itu. DLL menyediakan_stat
,system
danprintf
. (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:
stat
fungsi akan kembali informasi-ada sangat terbatas perizinan berguna atau nomor inode, misalnya.c:file.txt
diselesaikan sesuai dengan direktori kerja saat ini terkait dengan drivec:
.system
digunakancmd.exe /c
untuk 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.dll
Cygwin : (Cygwin proper) dancyggcc_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:
stat
fungsi memiliki fungsionalitas yang kaya, kembali nilai-nilai yang berarti di sebagian besar bidang.c:file.txt
sama sekali tidak dipahami sebagai berisi referensi huruf drive, karenac:
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.system
fungsi mencoba untuk menggunakan/bin/sh -c
penerjemah. Cygwin akan menyelesaikan/
jalur sesuai dengan lokasi executable Anda, dan mengharapkansh.exe
program untuk ditempatkan bersama dengan executable Anda.Baik Cygwin dan MinGW memungkinkan Anda untuk menggunakan fungsi Win32. Jika Anda ingin menelepon
MessageBox
atauCreateProcess
, Anda dapat melakukannya. Anda juga dapat dengan mudah membangun program yang tidak memerlukan jendela konsol, menggunakangcc -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.dll
ataumsvcrtnn.dll
run-times yang dapat didistribusikan kembali ). Contoh dari ini adalahspawn*
keluarga fungsi sepertispawnvp
. Ini adalah ide yang baik untuk digunakan daripadafork
danexec
pada Cygwin karena mereka memetakan lebih baik untuk model pembuatan proses Windows yang tidak memiliki konsepfork
.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 dantermios
, yang bekerja dengan konsol Microsoft! Aplikasi POSIX yang mengatur mode mentah dengantcsetattr
dan menggunakan kode VT100 untuk mengontrol kursor akan bekerja tepat dicmd.exe
jendela. Sejauh menyangkut pengguna akhir, itu adalah aplikasi konsol asli yang membuat panggilan Win32 untuk mengontrol konsol.Namun:
/bin/sh
dan 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.dll
tanpa 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/bin
bawah 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 Cygnalcygwin1.dll
, jalan itu tidak masuk akal, sedangkan itu akan mengertic:foo.txt
.sumber
Wikipedia mengatakan :
sumber
apt-cyg
karena mungkin bahkan lebih mudah daripada menggunakan apt di bawah WSL.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.sumber
Jawaban lain sudah mengenai target. Saya hanya ingin menambahkan ilustrasi untuk tangkapan cepat.
sumber
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).
sumber
clang
adalah solusi lintas-platform yang layak.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
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.
sumber
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
gcc
danbash
tersedia. 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 aslimsvcrt.dll
serta secara statis ke beberapa bagianglibc
. 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.
sumber
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
mingw
tanpacygwin
lingkungan, asalkan semua pustaka yang diperlukan (DLL) ada.sumber
Cygwin
menggunakan lapisan kompatibilitas, sedangkanMinGW
asli. Itulah salah satu perbedaan utama.sumber