ฉันต้องการสร้างแพลตฟอร์มข้ามโครงการ 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.txt
c:
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.dll
Cygwin จึงเป็นสภาพแวดล้อมที่ยอดเยี่ยมสำหรับการย้ายโปรแกรม 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/bin
Cygwin ของคุณ ภายใต้ Cygwin ไฟล์ปฏิบัติการจะทำงานกับพา ธ/cygdrive/c/Users/bob
ดังนี้ ในการใช้งานพื้นเมืองซึ่งจะมีการเชื่อมโยงกับรุ่น Cygnal ของเส้นทางที่จะทำให้รู้สึกไม่ในขณะที่มันจะเข้าใจcygwin1.dll
c:foo.txt
MinGW
คดเคี้ยวจากรุ่น 1.3.3Cygwin
ของ แม้ว่าทั้งสองCygwin
และMinGW
สามารถนำมาใช้กับพอร์ตUNIX
ซอฟต์แวร์เพื่อWindows
ที่พวกเขามีวิธีการที่แตกต่างกันCygwin
มีจุดมุ่งหมายที่จะให้สมบูรณ์แบบPOSIX layer
ที่ให้ emulations ของสายหลายระบบและห้องสมุดที่มีอยู่บนLinux
,UNIX
และBSD
สายพันธุ์POSIX layer
ทำงานบนWindows
เสียสละประสิทธิภาพการทำงานที่จำเป็นสำหรับการทำงานร่วมกัน ดังนั้นวิธีการนี้ต้องใช้Windows
โปรแกรมที่เขียนด้วยCygwin
เพื่อทำงานบนของห้องสมุดความเข้ากันได้ copyleftedsource code
ที่จะต้องกระจายกับโปรแกรมพร้อมกับโปรแกรม มีจุดมุ่งหมายเพื่อให้การทำงานพื้นเมืองและประสิทธิภาพการทำงานที่ผ่านโดยตรงMinGW
Windows API calls
แตกต่างCygwin
,MinGW
ไม่จำเป็นต้องมีชั้นความเข้ากันได้และทำให้โปรแกรมไม่จำเป็นต้องได้รับการกระจายกับDLL
source code
เพราะ
MinGW
มันขึ้นอยู่กับWindows API calls
ว่ามันไม่สามารถให้เต็มPOSIX API
; ไม่สามารถรวบรวมบางอย่างUNIX applications
ที่สามารถรวบรวมCygwin
ได้ โดยเฉพาะนี้ใช้กับงานที่ต้องมีPOSIX
การทำงานเหมือนfork()
,mmap()
หรือและผู้ที่คาดว่าจะได้ทำงานในioctl()
POSIX environment
โปรแกรมที่เขียนโดยใช้cross-platform library
ที่มีตัวเองอยู่ในรังเพลิงMinGW
เช่นSDL
,wxWidgets
,Qt
หรือGTK+
จะมักจะรวบรวมได้อย่างง่ายดายใน ขณะที่พวกเขาจะอยู่ในMinGW
Cygwin
การรวมกันของ
MinGW
และMSYS
ให้สภาพแวดล้อมขนาดเล็กในตัวเองที่สามารถโหลดลงในสื่อที่ถอดออกได้โดยไม่ต้องออกรายการในรีจิสทรีหรือไฟล์บนคอมพิวเตอร์Cygwin
พกพาให้คุณสมบัติที่คล้ายกัน ด้วยการมอบฟังก์ชันการทำงานที่Cygwin
มากขึ้นทำให้การติดตั้งและบำรุงรักษามีความซับซ้อนมากขึ้นนอกจากนี้ยังเป็นไปได้ที่จะมี
cross-compile Windows applications
MinGW-GCC under POSIX systems
ซึ่งหมายความว่านักพัฒนาไม่จำเป็นต้องมีการติดตั้ง Windows ด้วยMSYS
ซอฟต์แวร์รวบรวมที่จะทำงานในโดยไม่ต้องWindows
Cygwin
อย่ามองข้ามซอฟต์แวร์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
เป็นพื้นเมือง นั่นคือหนึ่งในความแตกต่างที่สำคัญ