ฉันต้องการสร้างแพลตฟอร์มข้ามโครงการ C ++ และฉันกำลังพิจารณาใช้ Cygwin / MinGW แต่ความแตกต่างระหว่างพวกเขาคืออะไร?
คำถามอื่นคือฉันจะสามารถใช้งานไบนารีบนระบบที่ไม่มี Cygwin / MinGW ได้หรือไม่?
ฉันต้องการสร้างแพลตฟอร์มข้ามโครงการ C ++ และฉันกำลังพิจารณาใช้ Cygwin / MinGW แต่ความแตกต่างระหว่างพวกเขาคืออะไร?
คำถามอื่นคือฉันจะสามารถใช้งานไบนารีบนระบบที่ไม่มี Cygwin / MinGW ได้หรือไม่?
คำตอบ:
เป็นการทำให้เข้าใจง่ายเช่นนี้:
รวบรวมสิ่งที่อยู่ใน Cygwin และคุณกำลังรวบรวมสำหรับ Cygwin
รวบรวมสิ่งที่อยู่ใน MinGW และคุณกำลังรวบรวมสำหรับ Windows
เกี่ยวกับ Cygwin
วัตถุประสงค์ของ Cygwin คือการทำให้การย้ายแอพพลิเคชั่นบน Unix ไปใช้กับ Windows ทำได้ง่ายขึ้นมากโดยจำลองรายละเอียดเล็ก ๆ น้อย ๆ ที่ระบบปฏิบัติการที่ใช้ Unix จัดทำและจัดทำเอกสารตามมาตรฐานPOSIX แอปพลิเคชันของคุณสามารถใช้คุณสมบัติ Unix เช่นไพพ์, ไฟล์สไตล์ยูนิกซ์และการเข้าถึงไดเร็กตอรี่, และอื่น ๆ , และสามารถคอมไพล์ด้วย Cygwin ซึ่งจะทำหน้าที่เป็นเลเยอร์ความเข้ากันได้รอบแอปพลิเคชันของคุณ ยังคงถูกนำมาใช้
เมื่อคุณแจกจ่ายซอฟต์แวร์ผู้รับจะต้องเรียกใช้พร้อมกับสภาพแวดล้อมรันไทม์ของ Cygwin (จัดทำโดยไฟล์cygwin1.dll) คุณสามารถแจกจ่ายสิ่งนี้กับซอฟต์แวร์ของคุณ แต่ซอฟต์แวร์ของคุณจะต้องปฏิบัติตามใบอนุญาตโอเพนซอร์ซ มันอาจเป็นกรณีที่แม้เพียงแค่เชื่อมโยงซอฟต์แวร์ของคุณกับมัน แต่กระจาย dll แยกจากกันคุณยังอาจต้องให้เกียรติใบอนุญาตโอเพนซอร์ส
เกี่ยวกับ MinGW
MinGW มุ่งหวังที่จะเป็นเพียงพอร์ต Windows ของเครื่องมือคอมไพเลอร์ GNU เช่น GCC, Make, Bash และอื่น ๆ มันไม่พยายามที่จะเลียนแบบหรือให้ความเข้ากันได้กับ Unix แต่จะให้สภาพแวดล้อมที่จำเป็นน้อยที่สุดในการใช้ GCC (คอมไพเลอร์ GNU) และเครื่องมืออื่น ๆ จำนวนเล็กน้อยบน Windows. มันไม่มีเลเยอร์การจำลองแบบ Unix เช่น Cygwin แต่เป็นผลให้แอปพลิเคชันของคุณจำเป็นต้องได้รับการตั้งโปรแกรมให้สามารถทำงานใน Windows ได้ซึ่งอาจหมายถึงการเปลี่ยนแปลงที่สำคัญถ้ามันถูกสร้างขึ้นเพื่อใช้ในสภาพแวดล้อม Unix มาตรฐานและ ใช้คุณสมบัติเฉพาะ Unix เช่นที่กล่าวถึงก่อนหน้านี้ โดยค่าเริ่มต้นโค้ดที่คอมไพล์ใน GCC ของ MinGW จะทำการคอมไพล์ไปยังเป้าหมาย Windows X86 ดั้งเดิมรวมถึงไฟล์. exe และ. dll แม้ว่าคุณสามารถข้ามคอมไพล์ด้วยการตั้งค่าที่ถูกต้องเนื่องจากคุณใช้ชุดเครื่องมือคอมไพเลอร์ GNU
MinGW เป็นอีกทางเลือกหนึ่งสำหรับMicrosoft Visual C ++คอมไพเลอร์และการเชื่อมโยง / สร้างเครื่องมือ อาจเป็นไปได้ในบางกรณีที่จะใช้ MinGW เพื่อรวบรวมสิ่งที่มีไว้สำหรับการคอมไพล์ด้วย Microsoft Visual C ++, กับไลบรารี่ที่ถูกต้องและในบางกรณีด้วยการดัดแปลงอื่น ๆ
MinGW มีบางไลบรารีมาตรฐานพื้นฐานสำหรับการโต้ตอบกับระบบปฏิบัติการ Windows แต่เช่นเดียวกับไลบรารีมาตรฐานทั่วไปที่รวมอยู่ในคอลเลกชันคอมไพเลอร์ GNU สิ่งเหล่านี้ไม่ได้กำหนดข้อ จำกัด สิทธิ์ใช้งานซอฟต์แวร์ที่คุณสร้างขึ้น
สำหรับแอพพลิเคชั่นซอฟแวร์ที่ไม่น่าสนใจทำให้การใช้ข้ามแพลตฟอร์มเป็นสิ่งที่ท้าทายอย่างมากเว้นแต่คุณจะใช้เฟรมเวิร์กข้ามแพลตฟอร์มที่ครอบคลุม ในขณะที่ฉันเขียนเฟรมเวิร์ก Qtเป็นหนึ่งในสิ่งที่ได้รับความนิยมมากที่สุดสำหรับจุดประสงค์นี้ทำให้สามารถสร้างแอปพลิเคชั่นกราฟิกที่ทำงานบนระบบปฏิบัติการรวมถึง Windows แต่ก็มีตัวเลือกอื่น ๆ ด้วย หากคุณใช้เฟรมเวิร์กดังกล่าวตั้งแต่เริ่มต้นคุณไม่เพียง แต่สามารถลดอาการปวดหัวของคุณเมื่อถึงเวลาที่ต้องย้ายไปยังแพลตฟอร์มอื่น แต่คุณสามารถใช้วิดเจ็ตกราฟิกเดียวกัน - หน้าต่างเมนูและตัวควบคุม - ในทุกแพลตฟอร์มหากคุณเขียน แอพ GUI และให้พวกเขาปรากฏเป็นของผู้ใช้
Cygwin เป็นความพยายามในการสร้างสภาพแวดล้อม UNIX / POSIX ที่สมบูรณ์บน Windows การทำเช่นนี้จะใช้ DLLs ต่างๆ ในขณะที่ DLLs เหล่านี้ครอบคลุมโดย GPLv3 + ใบอนุญาตของพวกเขามีข้อยกเว้นที่ไม่บังคับให้งานที่ได้รับมาจาก GPLv3 + MinGW เป็นชุดคอมไพเลอร์ C / C ++ ซึ่งช่วยให้คุณสร้างโปรแกรมปฏิบัติการ Windows โดยไม่ต้องพึ่งพา DLLs ดังกล่าว - คุณต้องใช้งานปกติ MSVC ซึ่งเป็นส่วนหนึ่งของการติดตั้ง Microsoft Windows ปกติ
นอกจากนี้คุณยังจะได้รับมีขนาดเล็ก UNIX / POSIX เช่นสภาพแวดล้อมรวบรวมกับ MinGW เรียกMSYS มันไม่ได้มีคุณสมบัติใกล้เคียงกับคุณสมบัติทั้งหมดของ Cygwin แต่เหมาะสำหรับโปรแกรมเมอร์ที่ต้องการใช้ MinGW
เพื่อเพิ่มคำตอบอื่น ๆ Cygwin มาพร้อมกับห้องสมุด MinGW และส่วนหัวและคุณสามารถรวบรวมได้โดยไม่ต้องเชื่อมโยงไปยัง cygwin1.dll โดยใช้ -mno-cygwin flag กับ gcc ฉันชอบสิ่งนี้เป็นอย่างมากในการใช้ MinGW และ MSYS แบบธรรมดา
gcc-3 -mno-cygwin
                    mingw64-x86_64-gcc-coreแพคเกจ Cygwin จากนั้น MinGW-64 จะสามารถใช้งานได้เป็นx86_64-w64-mingw32-gccคำสั่งที่ตั้งชื่ออย่างเชื่องช้า ได้โปรดพระเจ้าบางคนรวมชื่อของสิ่งเหล่านี้เลือดแล้ว 
                    วิกิพีเดียไม่เปรียบเทียบที่นี่
จากเว็บไซต์ของ Cygwin :
- Cygwin เป็นสภาพแวดล้อมคล้าย Linux สำหรับ Windows ประกอบด้วยสองส่วนคือ DLL (cygwin1.dll) ซึ่งทำหน้าที่เป็นเลเยอร์การจำลอง Linux API ที่ให้ฟังก์ชันการทำงาน Linux API จำนวนมาก
 - ชุดเครื่องมือที่ให้รูปลักษณ์ของ Linux
 
จากเว็บไซต์ของ Mingw :
MinGW ("Minimalistic GNU สำหรับ Windows") คือชุดของไฟล์ส่วนหัวเฉพาะของ Windows ที่พร้อมใช้งานได้อย่างอิสระและแจกจ่ายได้อย่างอิสระและไลบรารีนำเข้ารวมกับชุดเครื่องมือ GNU ที่อนุญาตให้สร้างโปรแกรม Windows ดั้งเดิมที่ไม่ต้องพึ่งพา C runtime DLL ของ บริษัท อื่น
Cygwin ใช้ DLL, cygwin.dll (หรืออาจเป็นชุดของ DLLs) เพื่อให้รันไทม์เหมือน POSIX บน Windows
MinGW คอมไพล์โปรแกรมประยุกต์ Win32 ดั้งเดิม
หากคุณสร้างบางสิ่งด้วย Cygwin ระบบที่คุณติดตั้งจะต้องมี Cygwin DLL แอปพลิเคชั่น MinGW ไม่ต้องการรันไทม์พิเศษใด ๆ
อ่านคำถามที่ตอบแล้วเพื่อทำความเข้าใจความแตกต่างระหว่าง Cygwin และ MinGW
คำถาม # 1: ฉันต้องการสร้างแอปพลิเคชันที่ฉันเขียนซอร์สโค้ดหนึ่งครั้งคอมไพล์ครั้งเดียวและรันในแพลตฟอร์มใด ๆ (เช่น Windows, Linux และ Mac OS X …)
คำตอบ # 1: เขียนซอร์สโค้ดของคุณใน JAVA รวบรวมซอร์สโค้ดหนึ่งครั้งและเรียกใช้จากที่ใดก็ได้
คำถาม # 2: ฉันต้องการสร้างแอปพลิเคชันที่ฉันเขียนซอร์สโค้ดหนึ่งครั้ง แต่ไม่มีปัญหาที่ฉันรวบรวมซอร์สโค้ดสำหรับแพลตฟอร์มใด ๆ แยกต่างหาก (เช่น Windows, Linux และ Mac OS X …)
คำตอบ # 2: เขียนซอร์สโค้ดของคุณใน C หรือ C ++ ใช้ไฟล์ส่วนหัวมาตรฐานเท่านั้น ใช้คอมไพเลอร์ที่เหมาะสมสำหรับแพลตฟอร์มใด ๆ (เช่น Visual Studio สำหรับ Windows, GCC สำหรับ Linux และ XCode สำหรับ Mac) โปรดทราบว่าคุณไม่ควรใช้คุณสมบัติการเขียนโปรแกรมขั้นสูงใด ๆ เพื่อรวบรวมซอร์สโค้ดของคุณในทุกแพลตฟอร์มได้สำเร็จ หากคุณไม่ใช้คลาสหรือฟังก์ชั่นมาตรฐาน C หรือ C ++ ซอร์สโค้ดของคุณจะไม่คอมไพล์ในแพลตฟอร์มอื่น
คำถาม # 3: ในการตอบคำถาม # 2 เป็นการยากที่จะใช้คอมไพเลอร์ต่างกันสำหรับแต่ละแพลตฟอร์มมีคอมไพเลอร์ข้ามแพลตฟอร์มหรือไม่
คำตอบ # 3: ใช่ใช้คอมไพเลอร์ GCC มันเป็นคอมไพเลอร์ข้ามแพลตฟอร์ม ในการรวบรวมซอร์สโค้ดของคุณใน Windows ให้ใช้MinGWที่ให้คอมไพเลอร์ GCC สำหรับ Windows และรวบรวมซอร์สโค้ดของคุณไปยังโปรแกรม Windows ดั้งเดิม อย่าใช้คุณสมบัติการเขียนโปรแกรมขั้นสูง (เช่น Windows API) เพื่อรวบรวมซอร์สโค้ดของคุณในทุกแพลตฟอร์มได้สำเร็จ หากคุณใช้ฟังก์ชัน Windows API ซอร์สโค้ดของคุณจะไม่รวบรวมในแพลตฟอร์มอื่น
คำถาม # 4: ไฟล์ส่วนหัวมาตรฐาน C หรือ C ++ ไม่ได้มีคุณสมบัติการเขียนโปรแกรมขั้นสูงเช่นมัลติเธรด ฉันควรทำอย่างไร
คำตอบ # 4: คุณควรใช้มาตรฐาน POSIX (ระบบปฏิบัติการพกพาอินเตอร์เฟส [สำหรับ UNIX]) มันมีคุณสมบัติการเขียนโปรแกรมขั้นสูงและเครื่องมือ ระบบปฏิบัติการหลายระบบรองรับ POSIX ทั้งหมดหรือบางส่วน (เช่น Mac OS X, Solaris, BSD / OS และ ... ) ระบบปฏิบัติการบางระบบในขณะที่ไม่ได้รับการรับรองอย่างเป็นทางการว่ารองรับ POSIX ได้เป็นส่วนใหญ่ (เช่น Linux, FreeBSD, OpenSolaris และ ... ) Cygwinให้การพัฒนาที่สอดคล้องกับ POSIX และสภาพแวดล้อมแบบรันไทม์สำหรับ Microsoft Windows
ดังนั้น:
จากมุมมองของการย้ายโปรแกรม C วิธีที่ดีในการทำความเข้าใจนี้คือการใช้ตัวอย่าง:
#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;
}
ถ้าเราเปลี่ยนstatเป็น_statเราสามารถคอมไพล์โปรแกรมนี้ด้วย Microsoft Visual C เราสามารถคอมไพล์โปรแกรมนี้ด้วย MinGW และ Cygwin
ภายใต้ Microsoft Visual C โปรแกรมจะถูกเชื่อมโยงกับไลบรารีรันไทม์ที่แจกจ่ายต่อได้ MSVC: mxvcrtnn.dllซึ่งnnเป็นส่วนต่อท้ายของเวอร์ชันบางส่วน ในการจัดส่งโปรแกรมนี้เราจะต้องรวม DLL นั้นด้วย นั่น DLL ให้_stat, และsystem printf(นอกจากนี้เรายังมีตัวเลือกในการเชื่อมโยงเวลาทำงานแบบคงที่)
ภายใต้ MinGW โปรแกรมจะถูกเชื่อมโยงกับ msvcrt.dllซึ่งเป็นไลบรารีภายในที่ไม่มีเอกสารไม่มีส่วนใด ๆ ที่เป็นส่วนหนึ่งของ Windows และไม่ จำกัด การใช้งานแอปพลิเคชัน ไลบรารี่นั้นเป็นส่วนหนึ่งของไลบรารี่รันไทม์ที่แจกจ่ายซ้ำได้จาก MS Visual C เพื่อการใช้งานโดย Windows เอง
ภายใต้ทั้งสองนี้โปรแกรมจะมีพฤติกรรมที่คล้ายกัน:
statฟังก์ชั่นจะกลับมาที่ จำกัด มากข้อมูลไม่มีสิทธิ์ประโยชน์หรือ inode จำนวนตัวอย่างเช่นc:file.txtc:systemใช้cmd.exe /cสำหรับรันคำสั่งภายนอกนอกจากนี้เรายังสามารถรวบรวมโปรแกรมภายใต้ Cygwin ในทำนองเดียวกันกับเวลาทำงานแบบแจกจ่ายต่อได้ที่ใช้โดย MS Visual C โปรแกรม Cygwin จะถูกเชื่อมโยงกับไลบรารีรันไทม์ของ Cygwin: cygwin1.dll(เหมาะสม Cygwin) และcyggcc_s-1.dll(สนับสนุน GCC แบบรันไทม์) เนื่องจาก Cygwin อยู่ภายใต้ LGPL เราจึงสามารถจัดทำแพคเกจกับโปรแกรมของเราแม้ว่าจะไม่ใช่ซอฟต์แวร์ฟรีที่ใช้กับ GPL ได้และจัดส่งโปรแกรม
ภายใต้ Cygwin ฟังก์ชันไลบรารีจะทำงานแตกต่างกัน:
statฟังก์ชั่นนี้มีฟังก์ชั่นการใช้งานที่หลากหลายและคืนค่าที่มีความหมายในฟิลด์ส่วนใหญ่c:file.txtไม่เข้าใจเลยว่ามีการอ้างอิงอักษรชื่อไดรฟ์เนื่องจากc:ไม่ได้ตามด้วยเครื่องหมายทับ ลำไส้ใหญ่ถือเป็นส่วนหนึ่งของชื่อและ mangled อย่างใดเข้าไป ไม่มีแนวคิดเกี่ยวกับพา ธ สัมพัทธ์กับไดรฟ์หรือไดรฟ์ใน Cygwin ไม่มีแนวคิด "ไดรฟ์บันทึกปัจจุบัน" และไม่มีไดเร็กตอรี่ปัจจุบันทำงานต่อไดรฟ์systemฟังก์ชั่นพยายามที่จะใช้/bin/sh -cล่าม Cygwin จะแก้ไข/เส้นทางตามที่ตั้งของปฏิบัติการของคุณและคาดว่าsh.exeโปรแกรมจะอยู่ร่วมกับปฏิบัติการของคุณทั้ง Cygwin และ MinGW อนุญาตให้คุณใช้ฟังก์ชัน Win32 หากคุณต้องการโทรMessageBoxหรือCreateProcessคุณสามารถทำได้ คุณสามารถสร้างโปรแกรมที่ไม่ต้องการหน้าต่างคอนโซลได้อย่างง่ายดายโดยใช้gcc -mwindowsภายใต้ MinGW และ Cygwin
Cygwin ไม่ใช่ POSIX อย่างเคร่งครัด นอกเหนือจากการให้การเข้าถึง Windows API มันยังให้การใช้งานของตัวเองของฟังก์ชั่นบางอย่างของ Microsoft C (สิ่งที่พบในmsvcrt.dllหรือเวลาทำงานซ้ำอีกmsvcrtnn.dllครั้ง) ตัวอย่างนี้เป็นครอบครัวของฟังก์ชั่นเช่นspawn* spawnvpนี่เป็นความคิดที่ดีที่จะใช้แทนforkและexecใน Cygwin ตั้งแต่พวกเขา map ดีกว่าที่จะสร้างแบบจำลองกระบวนการของ Windows forkซึ่งมีแนวคิดของการไม่มี
ดังนั้น:
โปรแกรม Cygwin นั้นไม่ได้เป็น "เจ้าของภาษา" น้อยไปกว่าโปรแกรม MS Visual C เนื่องจากต้องใช้ไลบรารีร่วมกัน การใช้งานภาษาการเขียนโปรแกรมบน Windows คาดว่าจะให้เวลาทำงานของตัวเองแม้การใช้งานภาษา C ไม่มี "libc" ใน Windows สำหรับการใช้งานสาธารณะ
ความจริงที่ว่า MinGW ไม่ต้องใช้ DLL ของบุคคลที่สามเป็นข้อเสีย มันขึ้นอยู่กับทางแยกที่ไม่มีเอกสาร Windows ภายในของ Visual C รันไทม์ MinGW ทำเช่นนี้เนื่องจากข้อยกเว้นไลบรารีระบบ GPL นำไปใช้msvcrt.dllซึ่งหมายความว่าโปรแกรม GPL-ed สามารถรวบรวมและแจกจ่ายใหม่ด้วย MinGW
เนื่องจากการสนับสนุนที่กว้างขึ้นและลึกซึ้งยิ่งขึ้นสำหรับ POSIX เมื่อเทียบกับmsvcrt.dllCygwin จึงเป็นสภาพแวดล้อมที่ยอดเยี่ยมสำหรับการย้ายโปรแกรม POSIX เนื่องจากขณะนี้อยู่ภายใต้ LGPL จึงอนุญาตให้แอปพลิเคชันที่มีใบอนุญาตทุกประเภทเปิดหรือปิดแหล่งที่มาจะถูกแจกจ่ายต่อ  Cygwin ยังมีการจำลอง VT100 และใช้termiosงานได้กับคอนโซล Microsoft! แอปพลิเคชัน POSIX ที่ตั้งค่าโหมด raw ด้วยtcsetattrและใช้รหัส VT100 เพื่อควบคุมเคอร์เซอร์จะทำงานได้ทันทีในcmd.exeหน้าต่าง เท่าที่ผู้ใช้ปลายทางมีความกังวลมันเป็นแอปคอนโซลที่ใช้ในการเรียก Win32 เพื่อควบคุมคอนโซล
อย่างไรก็ตาม:
/bin/shและปัญหาอื่น ๆ ความแตกต่างเหล่านี้คือสิ่งที่ทำให้โปรแกรม Cygwin "ไม่ใช่เจ้าของภาษา" หากโปรแกรมใช้พา ธ เป็นอาร์กิวเมนต์หรืออินพุตจากกล่องโต้ตอบผู้ใช้ Windows คาดหวังว่าพา ธ นั้นจะทำงานในลักษณะเดียวกับที่ทำในโปรแกรม Windows อื่น ๆ หากวิธีนี้ใช้ไม่ได้แสดงว่าเป็นปัญหาปลั๊กอิน:ไม่นานหลังจากประกาศ LGPL ฉันเริ่มต้นโครงการCygnal (Cygwin Native Application Library) เพื่อจัดเตรียม Cygwin DLL ซึ่งมีจุดมุ่งหมายเพื่อแก้ไขปัญหาเหล่านี้ โปรแกรมสามารถพัฒนาได้ภายใต้ Cygwin จากนั้นปรับใช้กับ Cygnal เวอร์ชันที่cygwin1.dllไม่มีการคอมไพล์ซ้ำ เมื่อไลบรารีนี้ปรับปรุงให้ดีขึ้นก็จะค่อย ๆ ขจัดความต้องการ MinGW
เมื่อ Cygnal แก้ปัญหาการจัดการเส้นทางมันจะเป็นไปได้ที่จะพัฒนาไฟล์ปฏิบัติการเดี่ยวซึ่งทำงานกับพา ธ Windows เมื่อจัดส่งเป็นแอปพลิเคชัน Windows ที่มี Cygnal และทำงานร่วมกับเส้นทาง Cygwin ได้อย่างราบรื่นเมื่อติดตั้งใน/usr/binCygwin ของคุณ ภายใต้ Cygwin ไฟล์ปฏิบัติการจะทำงานกับพา ธ/cygdrive/c/Users/bobดังนี้ ในการใช้งานพื้นเมืองซึ่งจะมีการเชื่อมโยงกับรุ่น Cygnal ของเส้นทางที่จะทำให้รู้สึกไม่ในขณะที่มันจะเข้าใจcygwin1.dllc:foo.txt
MinGWคดเคี้ยวจากรุ่น 1.3.3Cygwinของ แม้ว่าทั้งสองCygwinและMinGWสามารถนำมาใช้กับพอร์ตUNIXซอฟต์แวร์เพื่อWindowsที่พวกเขามีวิธีการที่แตกต่างกันCygwinมีจุดมุ่งหมายที่จะให้สมบูรณ์แบบPOSIX layerที่ให้ emulations ของสายหลายระบบและห้องสมุดที่มีอยู่บนLinux,UNIXและBSDสายพันธุ์POSIX layerทำงานบนWindowsเสียสละประสิทธิภาพการทำงานที่จำเป็นสำหรับการทำงานร่วมกัน ดังนั้นวิธีการนี้ต้องใช้Windowsโปรแกรมที่เขียนด้วยCygwinเพื่อทำงานบนของห้องสมุดความเข้ากันได้ copyleftedsource codeที่จะต้องกระจายกับโปรแกรมพร้อมกับโปรแกรม มีจุดมุ่งหมายเพื่อให้การทำงานพื้นเมืองและประสิทธิภาพการทำงานที่ผ่านโดยตรงMinGWWindows API callsแตกต่างCygwin,MinGWไม่จำเป็นต้องมีชั้นความเข้ากันได้และทำให้โปรแกรมไม่จำเป็นต้องได้รับการกระจายกับDLLsource codeเพราะ
MinGWมันขึ้นอยู่กับWindows API callsว่ามันไม่สามารถให้เต็มPOSIX API; ไม่สามารถรวบรวมบางอย่างUNIX applicationsที่สามารถรวบรวมCygwinได้ โดยเฉพาะนี้ใช้กับงานที่ต้องมีPOSIXการทำงานเหมือนfork(),mmap()หรือและผู้ที่คาดว่าจะได้ทำงานในioctl()POSIX environmentโปรแกรมที่เขียนโดยใช้cross-platform libraryที่มีตัวเองอยู่ในรังเพลิงMinGWเช่นSDL,wxWidgets,QtหรือGTK+จะมักจะรวบรวมได้อย่างง่ายดายใน ขณะที่พวกเขาจะอยู่ในMinGWCygwinการรวมกันของ
MinGWและMSYSให้สภาพแวดล้อมขนาดเล็กในตัวเองที่สามารถโหลดลงในสื่อที่ถอดออกได้โดยไม่ต้องออกรายการในรีจิสทรีหรือไฟล์บนคอมพิวเตอร์Cygwinพกพาให้คุณสมบัติที่คล้ายกัน ด้วยการมอบฟังก์ชันการทำงานที่Cygwinมากขึ้นทำให้การติดตั้งและบำรุงรักษามีความซับซ้อนมากขึ้นนอกจากนี้ยังเป็นไปได้ที่จะมี
cross-compile Windows applicationsMinGW-GCC under POSIX systemsซึ่งหมายความว่านักพัฒนาไม่จำเป็นต้องมีการติดตั้ง Windows ด้วยMSYSซอฟต์แวร์รวบรวมที่จะทำงานในโดยไม่ต้องWindowsCygwin
อย่ามองข้ามซอฟต์แวร์U / Winของ AT&Tซึ่งได้รับการออกแบบมาเพื่อช่วยให้คุณรวบรวมแอปพลิเคชั่น Unix บน windows (เวอร์ชันล่าสุด - 2012-08-06; ใช้ Eclipse Public License, เวอร์ชั่น 1.0)
เช่นเดียวกับ Cygwin พวกเขาต้องวิ่งไปที่ห้องสมุด POSIX.DLLในกรณีของพวกเขา พวก AT&T เป็นวิศวกรที่ยอดเยี่ยม (กลุ่มเดียวกันที่นำ ksh และdotมาให้คุณ) และสิ่งของต่างๆของพวกเขานั้นคุ้มค่าที่จะเช็คเอาท์
Cygwin จำลองสภาพแวดล้อม POSIX ทั้งหมดในขณะที่ MinGW เป็นชุดเครื่องมือขั้นต่ำสำหรับการรวบรวมเท่านั้น (รวบรวมแอปพลิเคชั่น Win ดั้งเดิม) ดังนั้นหากคุณต้องการทำให้โครงการข้ามแพลตฟอร์มของคุณเป็นทางเลือกระหว่างสองอย่างชัดเจน MinGW
แม้ว่าคุณอาจพิจารณาใช้ VS บน Windows แต่ GCC บน Linux / Unices โครงการโอเพ่นซอร์สส่วนใหญ่ทำเช่นนั้น (เช่น Firefox หรือ Python)
clangเป็นโซลูชันข้ามแพลตฟอร์มที่ทำงานได้
                    โปรดทราบว่าลักษณะการทำงานของยูทิลิตี้อาจแตกต่างกันอย่างแท้จริงระหว่างสอง
ตัวอย่างเช่น Cygwin tar สามารถแยกได้ - เนื่องจาก fork () รองรับใน DLL - โดยที่รุ่น mingw ไม่สามารถทำได้ นี่เป็นปัญหาเมื่อพยายามรวบรวม mysql จากแหล่งที่มา
ในการใช้ Cygwin ในแอพพลิเคชั่นการค้า / กรรมสิทธิ์ / ไม่ใช่โอเพนซอร์ซคุณจะต้องแยกออกเป็นหมื่นดอลลาร์สำหรับ "การซื้อใบอนุญาต " จาก Red Hat สิ่งนี้จะทำให้ข้อกำหนดการออกใบอนุญาตมาตรฐานใช้ไม่ได้ในราคาแพง Google "cygwin ค่าใช้จ่ายใบอนุญาต" และดูผลลัพธ์แรก ๆ
สำหรับ mingw ไม่มีค่าใช้จ่ายเกิดขึ้นและใบอนุญาต (PD, BSD, MIT) ได้รับอนุญาตอย่างมาก ส่วนใหญ่คุณอาจคาดว่าจะให้รายละเอียดใบอนุญาตกับใบสมัครของคุณเช่นใบอนุญาต winpthreads ที่จำเป็นเมื่อใช้ mingw64-tdm
แก้ไขเนื่องจาก Izzy Helianthus:สิทธิ์การใช้งานเชิงพาณิชย์ไม่สามารถใช้งานได้อีกต่อไปหรือจำเป็นเพราะห้องสมุด API ที่พบในไดเรกทอรีย่อย winsup ของ Cygwin ได้รับการเผยแพร่ภายใต้ LGPL เมื่อเทียบกับ GPL แบบเต็ม
Cygwin ถูกออกแบบมาเพื่อมอบสภาพแวดล้อม POSIX ที่สมบูรณ์มากขึ้นหรือน้อยลงสำหรับ Windows รวมถึงชุดเครื่องมือที่กว้างขวางที่ออกแบบมาเพื่อให้แพลตฟอร์ม Linux ที่สมบูรณ์แบบ ในการเปรียบเทียบ MinGW และ MSYS ให้มีน้ำหนักเบาเรียบง่าย POSIX เหมือนชั้นมีเพียงเครื่องมือที่จำเป็นมากขึ้นเช่นgccและbashพร้อมใช้งาน เนื่องจากวิธีการที่เรียบง่ายกว่าของ MinGW จึงไม่ได้ให้ระดับการครอบคลุม POSIX API ที่ Cygwin เสนอดังนั้นจึงไม่สามารถสร้างโปรแกรมบางโปรแกรมที่สามารถคอมไพล์บน Cygwin ได้
ในแง่ของรหัสที่สร้างโดยทั้งสองเครื่องมือ Cygwin อาศัยการเชื่อมโยงแบบไดนามิกไปยังไลบรารีรันไทม์ขนาดใหญ่cygwin1.dllในขณะที่ MinGW toolchain รวบรวมรหัสไปยังไบนารีที่เชื่อมโยงแบบไดนามิกไปยังไลบรารีเนทีฟ Windows ของ C msvcrt.dllและแบบคงที่ไปยังส่วนglibcต่างๆ ดังนั้นไฟล์ปฏิบัติการ Cygwin จึงมีขนาดกะทัดรัดกว่า แต่ต้องการ DLL ที่แจกจ่ายต่อได้แยกต่างหากในขณะที่ไบนารี MinGW สามารถส่งได้แบบสแตนด์อโลน แต่มีแนวโน้มที่จะใหญ่กว่า
ความจริงที่ว่าโปรแกรมที่ใช้ Cygwin จำเป็นต้องใช้ DLL แยกต่างหากเพื่อให้ทำงานได้เช่นกัน ไลบรารีรันไทม์ Cygwin ได้รับอนุญาตภายใต้ GPLv3 พร้อมข้อยกเว้นการเชื่อมโยงสำหรับแอปพลิเคชันที่มีใบอนุญาตที่สอดคล้องกับ OSI ดังนั้นผู้พัฒนาที่ต้องการสร้างแอปพลิเคชันแบบโอเพ่นซอร์สรอบ Cygwin ต้องได้รับใบอนุญาตเชิงพาณิชย์จาก Red Hat ในทางกลับกันรหัส MinGW สามารถใช้ได้ทั้งในโปรแกรมโอเพนซอร์ซและโอเพนซอร์สเนื่องจากส่วนหัวและไลบรารีได้รับอนุญาตให้ใช้สิทธิ
Cygwinเป็นสภาพแวดล้อมแบบ Unix และอินเตอร์เฟสบรรทัดคำสั่งสำหรับ Microsoft Windows
Mingwเป็นพอร์ตซอฟต์แวร์ดั้งเดิมของ GNU Compiler Collection (GCC) ไปยัง Microsoft Windows พร้อมกับชุดของไลบรารีการนำเข้าที่สามารถแจกจ่ายได้อย่างอิสระและไฟล์ส่วนหัวสำหรับ Windows API MinGW อนุญาตให้นักพัฒนาสร้างแอปพลิเคชัน Microsoft Windows ดั้งเดิม
คุณสามารถเรียกใช้ไบนารีที่สร้างmingwโดยไม่มีcygwinสภาพแวดล้อมโดยมีเงื่อนไขว่ามีไลบรารีที่จำเป็นทั้งหมด (DLLs) อยู่
Cygwinใช้เลเยอร์ความเข้ากันได้ในขณะที่MinGWเป็นพื้นเมือง นั่นคือหนึ่งในความแตกต่างที่สำคัญ