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?
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?
Jawaban:
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.
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.
gcc-3 -mno-cygwin
mingw64-x86_64-gcc-core
paket 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.
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
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.
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:
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 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
mana nn
ada beberapa versi suffix. Untuk mengirimkan program ini, kami harus menyertakan DLL itu. DLL menyediakan _stat
, system
dan 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:
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 drive c:
.system
digunakan cmd.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) 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:
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, 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.system
fungsi mencoba untuk menggunakan /bin/sh -c
penerjemah. Cygwin akan menyelesaikan /
jalur sesuai dengan lokasi executable Anda, dan mengharapkan sh.exe
program untuk ditempatkan bersama dengan executable Anda.Baik Cygwin dan MinGW memungkinkan Anda untuk menggunakan fungsi Win32. Jika Anda ingin menelepon MessageBox
atau 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.dll
atau msvcrtnn.dll
run-times yang dapat didistribusikan kembali ). Contoh dari ini adalah spawn*
keluarga fungsi seperti spawnvp
. Ini adalah ide yang baik untuk digunakan daripada fork
dan exec
pada 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 tcsetattr
dan menggunakan kode VT100 untuk mengontrol kursor akan bekerja tepat di cmd.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 Cygnal cygwin1.dll
, jalan itu tidak masuk akal, sedangkan itu akan mengerti c:foo.txt
.
MinGW
bercabang dari versi 1.3.3 dariCygwin
. Meskipun keduaCygwin
danMinGW
dapat digunakan untuk pelabuhanUNIX
perangkat lunak untukWindows
, mereka memiliki pendekatan yang berbeda:Cygwin
bertujuan untuk memberikan lengkapPOSIX layer
yang menyediakan emulasi dari beberapa panggilan sistem dan perpustakaan yang ada diLinux
,UNIX
, danBSD
varian. ThePOSIX layer
berjalan di atasWindows
, mengorbankan kinerja di mana diperlukan untuk kompatibilitas. Karenanya, pendekatan ini memerlukanWindows
program yang ditulis denganCygwin
untuk dijalankan di atas pustaka kompatibilitas copyleft yang harus didistribusikan bersama program, bersama dengan programnyasource code
.MinGW
bertujuan untuk menyediakan fungsionalitas dan kinerja asli melalui langsungWindows API calls
. Tidak sepertiCygwin
,MinGW
tidak memerlukan lapisan kompatibilitasDLL
dan karenanya program tidak perlu didistribusikan bersamasource code
.Karena
MinGW
bergantung padaWindows API calls
, itu tidak dapat memberikan penuhPOSIX API
; tidak dapat mengkompilasi beberapaUNIX applications
yang dapat dikompilasiCygwin
. Secara khusus, ini berlaku untuk aplikasi yang memerlukanPOSIX
fungsionalitas sepertifork()
,mmap()
atauioctl()
dan mereka yang berharap untuk dijalankan diPOSIX environment
. Aplikasi yang ditulis menggunakancross-platform library
yang itu sendiri telah porting keMinGW
, sepertiSDL
,wxWidgets
,Qt
, atauGTK+
, biasanya akan mengkompilasi dengan mudah diMinGW
saat mereka akan diCygwin
.Kombinasi
MinGW
danMSYS
menyediakan lingkungan kecil yang mandiri yang dapat dimuat ke media yang dapat dilepas tanpa meninggalkan entri dalam registri atau file di komputer.Cygwin
Portable menyediakan fitur serupa. Dengan menyediakan lebih banyak fungsi,Cygwin
menjadi lebih rumit untuk dipasang dan dirawat.Mungkin juga
cross-compile Windows applications
denganMinGW-GCC under POSIX systems
. Ini berarti bahwa pengembang tidak memerlukan instalasi WindowsMSYS
untuk mengkompilasi perangkat lunak yang akan berjalanWindows
tanpaCygwin
.
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.
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).
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.
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.
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
dan bash
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 asli msvcrt.dll
serta 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.
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
tanpa cygwin
lingkungan, asalkan semua pustaka yang diperlukan (DLL) ada.
Cygwin
menggunakan lapisan kompatibilitas, sedangkan MinGW
asli. Itulah salah satu perbedaan utama.