ความแตกต่างระหว่าง Cygwin และ MinGW คืออะไร?


657

ฉันต้องการสร้างแพลตฟอร์มข้ามโครงการ C ++ และฉันกำลังพิจารณาใช้ Cygwin / MinGW แต่ความแตกต่างระหว่างพวกเขาคืออะไร?

คำถามอื่นคือฉันจะสามารถใช้งานไบนารีบนระบบที่ไม่มี Cygwin / MinGW ได้หรือไม่?

คำตอบ:


629

เป็นการทำให้เข้าใจง่ายเช่นนี้:

  • รวบรวมสิ่งที่อยู่ใน 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 และให้พวกเขาปรากฏเป็นของผู้ใช้


43
bash ที่มาพร้อมกับ MinGW ไม่ใช่โปรแกรม Windows ดั้งเดิม มันขึ้นอยู่กับ MSYS DLL ซึ่งเป็นทางแยกของ Cygwin DLL เหมือนกันสำหรับยูทิลิตี้ Unix อื่น ๆ ที่มาพร้อมกับ MinGW / MSYS MinGW gcc เป็นโปรแกรมดั้งเดิม ทำให้พร้อมใช้งานทั้งในเวอร์ชันเนทิฟและรุ่น MSYS
ak2

6
ความแตกต่างในแง่ของความเร็ว?
EKanadily

6
ความแตกต่างของความเร็วจะไม่สามารถทำได้ในทุกสถานการณ์ ความแตกต่างใด ๆ ก็จะลดลงไปตามระดับที่เป็นนามธรรมของเลเยอร์ความเข้ากันได้ที่เพิ่มขึ้นของ cygwin ทำให้สิ่งต่าง ๆ ช้าลง มันอาจมีผลที่วัดได้ในสิ่งต่าง ๆ เช่น I / O ตัวอย่างเช่นเมื่อนานมาแล้วGitก็ทำงานบน Windows ใน cygwin เท่านั้นและด้วยเหตุนี้มันจึงช้าลงเล็กน้อย จากนั้นอีกครั้งหากคุณใช้รหัสกับเฟรมเวิร์กนั่นก็เป็นเลเยอร์ที่เป็นนามธรรมซึ่งมีความเป็นไปได้ที่จะทำให้บางสิ่งช้าลงอยู่ดี
thomasrutter

28
ฉันควรทราบว่ารหัสที่คอมไพล์แล้วสำหรับ cygwin นั้นยังคงเป็นรหัสเนทีฟ - มันไม่จำเป็นต้องเรียกใช้ผ่านล่ามเหมือนว่า Java เป็นเพียงว่าเมื่อมันต้องมีการโต้ตอบกับคุณสมบัติระบบปฏิบัติการบางอย่างเช่นดิสก์ / ไฟล์มันจะผ่านชั้นอื่น
thomasrutter

4
ในทางกลับกันคุณจะไม่สามารถเปรียบเทียบได้เพราะคุณต้องเขียนรหัสของคุณแตกต่างกันไปขึ้นอยู่กับว่าเป็นของ cygwin หรือไม่ แม้ว่าซอฟต์แวร์ขนาดเล็กและเรียบง่ายอย่าง "สวัสดีโลก" ที่เทียบเท่า cygwin จะใหญ่ขึ้นเพียงเพราะ cygwin runtime library หากคุณไม่นับขนาดของไลบรารีรันไทม์ของ cygwin รุ่น cygwin มักจะเล็กลงแต่นั่นเป็นตัวเลขที่ผิดฉันคิดว่าห้องสมุดจะต้องจัดหาซอฟต์แวร์มาด้วยเสมอ ที่กล่าวว่าหากคุณใช้ไลบรารี่ / กรอบที่ไม่น่าสนใจก็จะขึ้นอยู่กับว่า
thomasrutter

311

Cygwin เป็นความพยายามในการสร้างสภาพแวดล้อม UNIX / POSIX ที่สมบูรณ์บน Windows การทำเช่นนี้จะใช้ DLLs ต่างๆ ในขณะที่ DLLs เหล่านี้ครอบคลุมโดย GPLv3 + ใบอนุญาตของพวกเขามีข้อยกเว้นที่ไม่บังคับให้งานที่ได้รับมาจาก GPLv3 + MinGW เป็นชุดคอมไพเลอร์ C / C ++ ซึ่งช่วยให้คุณสร้างโปรแกรมปฏิบัติการ Windows โดยไม่ต้องพึ่งพา DLLs ดังกล่าว - คุณต้องใช้งานปกติ MSVC ซึ่งเป็นส่วนหนึ่งของการติดตั้ง Microsoft Windows ปกติ

นอกจากนี้คุณยังจะได้รับมีขนาดเล็ก UNIX / POSIX เช่นสภาพแวดล้อมรวบรวมกับ MinGW เรียกMSYS มันไม่ได้มีคุณสมบัติใกล้เคียงกับคุณสมบัติทั้งหมดของ Cygwin แต่เหมาะสำหรับโปรแกรมเมอร์ที่ต้องการใช้ MinGW


59
แต่ถ้าฉันต้องการปล่อยซอฟต์แวร์ที่ไม่ใช่ GPL ฟรี ขออภัยฉันไม่ใช่แฟน GPL เลย

19
@Dan คุณไม่จำเป็นต้องแจกจ่ายรันไทม์ที่ MinGW ใช้ - เป็นส่วนหนึ่งของ Windows

14
@ ak2: นั่นเป็นเรื่องจริง แต่ทำให้เข้าใจผิด cygwyn gcc + cygwin สภาพแวดล้อมเริ่มต้นในการผลิตไบนารีที่เชื่อมโยงกับ (GPL) cygwin dll mingw + msys เป็นค่าเริ่มต้นในการสร้างไบนารีที่เชื่อมโยงกับแพลตฟอร์ม C lib
Sean McMillan

4
@DanMoulding หากคุณไม่ใช่แฟนของ Microsoft คุณจะต้องเพิกเฉยต่อความรู้สึกเหล่านั้นที่จะพัฒนาสำหรับ Windows ตั้งแต่แรก ;-)
Arda Xi

14
@ อานนท์ "แต่ถ้าฉันต้องการปล่อยซอฟต์แวร์ที่ไม่ใช่ GPL ฟรี" .. cygwin มีข้อยกเว้นพิเศษในเงื่อนไขการอนุญาตให้ใช้สิทธิซึ่งอนุญาตให้คุณแจกจ่ายซอฟต์แวร์ฟรีที่เชื่อมโยงกับซอฟต์แวร์นั้นภายใต้สัญญาอนุญาตโอเพนซอร์สอื่นที่ไม่ใช่ GPL ดู "ข้อยกเว้นการอนุญาตให้ใช้สิทธิ์โอเพนซอร์ซ" ที่นี่: cygwin.com/licensing.html
สตีฟคุก

138

เพื่อเพิ่มคำตอบอื่น ๆ Cygwin มาพร้อมกับห้องสมุด MinGW และส่วนหัวและคุณสามารถรวบรวมได้โดยไม่ต้องเชื่อมโยงไปยัง cygwin1.dll โดยใช้ -mno-cygwin flag กับ gcc ฉันชอบสิ่งนี้เป็นอย่างมากในการใช้ MinGW และ MSYS แบบธรรมดา


31
สิ่งนี้ไม่ทำงานอีกต่อไปกับ cygwin 1.7.6 gcc: แฟล็ก -mno-cygwin ถูกลบแล้ว ใช้คอมไพเลอร์ข้ามกลุ่มเป้าหมาย mingw
sigjuice

2
@sigjuice: จริง แต่ธง -mno-cygwin ยังคงใช้งานได้สำหรับ GCC 3.x:gcc-3 -mno-cygwin
Amro

1
ดังนั้นนี่หมายความว่าฉันต้องดาวน์โหลดไลบรารี mingw จากเว็บไซต์ทางการของ mingw เพื่อรวบรวมเป้าหมาย mingw จากโฮสต์ cygwin หรือไม่ หรือสามารถดาวน์โหลดไลบรารี่เหล่านี้ได้จากระบบแพ็คเกจของ Cygwin?
CMCDragonkai

5
@CMCDragonkai คุณสามารถรับคอมไพเลอร์ที่เข้ากันได้ mingw จากไซต์ Cygwin โดยเรียกใช้ยูทิลิตีการตั้งค่าและค้นหาและติ๊กพวกเขา ดังนั้นแม้ว่า gcc จะไม่สร้างรหัสที่เข้ากันได้กับ mingw อีกต่อไป แต่คุณสามารถภายใน Cygwin เรียกใช้ "mingw-gcc" (นั่นไม่ใช่ชื่อเต็ม) เพื่อให้สามารถปฏิบัติการได้แบบเดียวกับที่คอมไพเลอร์ mingw จะอยู่ภายใต้ msys
คนที่ว่างในพื้นที่ cardiff

9
เพื่อแก้ไขคำตอบที่เป็นประโยชน์ของ cardiff แพ็คเกจและคำสั่ง MinGW ของ Cygwin มีชื่อที่คลุมเครือบ้าง ในการติดตั้ง MinGW-64 (วันนี้สิ่งที่คุณต้องการเสมอ ) ติดตั้งmingw64-x86_64-gcc-coreแพคเกจ Cygwin จากนั้น MinGW-64 จะสามารถใช้งานได้เป็นx86_64-w64-mingw32-gccคำสั่งที่ตั้งชื่ออย่างเชื่องช้า ได้โปรดพระเจ้าบางคนรวมชื่อของสิ่งเหล่านี้เลือดแล้ว
Cecil Curry

60

วิกิพีเดียไม่เปรียบเทียบที่นี่

จากเว็บไซต์ของ Cygwin :

  • Cygwin เป็นสภาพแวดล้อมคล้าย Linux สำหรับ Windows ประกอบด้วยสองส่วนคือ DLL (cygwin1.dll) ซึ่งทำหน้าที่เป็นเลเยอร์การจำลอง Linux API ที่ให้ฟังก์ชันการทำงาน Linux API จำนวนมาก
  • ชุดเครื่องมือที่ให้รูปลักษณ์ของ Linux

จากเว็บไซต์ของ Mingw :

MinGW ("Minimalistic GNU สำหรับ Windows") คือชุดของไฟล์ส่วนหัวเฉพาะของ Windows ที่พร้อมใช้งานได้อย่างอิสระและแจกจ่ายได้อย่างอิสระและไลบรารีนำเข้ารวมกับชุดเครื่องมือ GNU ที่อนุญาตให้สร้างโปรแกรม Windows ดั้งเดิมที่ไม่ต้องพึ่งพา C runtime DLL ของ บริษัท อื่น


47

Cygwin ใช้ DLL, cygwin.dll (หรืออาจเป็นชุดของ DLLs) เพื่อให้รันไทม์เหมือน POSIX บน Windows

MinGW คอมไพล์โปรแกรมประยุกต์ Win32 ดั้งเดิม

หากคุณสร้างบางสิ่งด้วย Cygwin ระบบที่คุณติดตั้งจะต้องมี Cygwin DLL แอปพลิเคชั่น MinGW ไม่ต้องการรันไทม์พิเศษใด ๆ


42

อ่านคำถามที่ตอบแล้วเพื่อทำความเข้าใจความแตกต่างระหว่าง 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


ดังนั้น:

ในการใช้ประโยชน์จากคอมไพเลอร์ข้ามแพลตฟอร์มของ GCC ใน Windows ให้ใช้ MinGW

หากต้องการใช้ประโยชน์จากฟีเจอร์การเขียนโปรแกรมขั้นสูงมาตรฐาน POSIX และเครื่องมือใน Windows ให้ใช้ Cygwin


4
เกี่ยวกับคำถามเล็ก ๆ น้อย ๆ ของคุณ: 1) สิทธิของคุณหากคุณต้องการสิ่งที่ทำงานได้ทุกที่และไม่จำเป็นต้องรวบรวมเลือกสิ่งที่ต้องการจาวา (เช่นอย่าลืมภาษาไพ ธ อนภาษา Perl ภาษาทับทิมและภาษาสคริปต์อื่น ๆ ) 2) มันค่อนข้างผิดสำหรับกรณีของ C เนื่องจากคอมไพเลอร์ทั้งหมดของ C สนับสนุนได้ดีมาก 3) คุณยังสามารถใช้ win32 api ได้ แต่คุณต้องห่อมันไว้ในเลเยอร์ที่พกพาได้นั่นเป็นเพียงปัญหาการออกแบบ
Coyote21

1
4) สิ่งนี้ผิดทั้งหมดเพราะเหตุผลที่ฉันให้ไว้ข้างต้นเนื่องจาก POSIX เป็นเพียง api อื่นเท่านั้นเช่นกันถ้าคุณปกป้อง POSIX มากคุณควรรู้ว่าแม้ Unices ไม่จำเป็นต้องใช้ POSIX ชุดเดียวกันดังนั้นวิธีการ คุณจัดการกับสิ่งนั้นหรือไม่ POSIX เวลาจริงมาถึงใจ และนั่นทำให้คุณสรุปว่าเป็นการหลอกลวงอย่างสมบูรณ์และผิดเพราะคุณไม่จำเป็นต้องมี POSIX สำหรับสิ่งใดใน Windows คุณสามารถใช้ Win32 API ได้ หรือคุณคิดว่า Qt, GTK และ WxWidgets ได้พบวิธีที่จะข้ามแพลตฟอร์มฉันเดาว่าพวกเขาทั้งหมดต้องใช้ cygwin ใน windows -1 โหวตให้กับคำตอบของคุณ
Coyote21

4
ฉันไม่เข้าใจอาร์กิวเมนต์ของคุณ @ Coyote21 คุณกำลังบอกว่า POSIX ไม่เหมาะสำหรับการพัฒนาข้ามแพลตฟอร์ม? คุณกำลังบอกว่าวิธีเดียวที่เหมาะสมในการเขียนโค้ดใน C / C ++ สำหรับหลายแพลตฟอร์มคือการเขียนเลเยอร์ความเข้ากันได้ของคุณเองสำหรับแต่ละแพลตฟอร์มที่คุณต้องการให้การสนับสนุน? ฉันไม่เห็นอะไรผิดปกติกับข้อเสนอแนะเพื่อเริ่มต้นด้วย POSIX คุณต้องดูว่าจะสามารถรับคุณได้มากแค่ไหนและจะต้องใช้โซลูชันเลเยอร์ความเข้ากันได้ที่ครอบคลุมหรือไม่ เลเยอร์ความเข้ากันได้ขนาดใหญ่ไม่ใช่บรรทัดฐาน ที่จะพูดเป็นอย่างอื่นคือการโต้แย้งว่า POSIX เป็นความล้มเหลวที่สมบูรณ์
David Gladfelter

มัลติเธรดถูกนำไปใช้ผ่านชั้น POSIX แม้ใน MinGW
Alexander Shishenko

1
"คุณไม่ควรใช้คุณสมบัติการเขียนโปรแกรมขั้นสูงใด ๆ เพื่อรวบรวมซอร์สโค้ดของคุณในทุกแพลตฟอร์มให้สำเร็จ" คุณต้องอธิบายให้ชัดเจนว่าคุณหมายถึงอะไรโดย "คุณสมบัติการเขียนโปรแกรมขั้นสูง" จากการคาดการณ์ของฉันในภายหลังว่าคุณหมายถึงคุณสมบัติเฉพาะแพลตฟอร์ม หากคุณหมายถึงคุณสมบัติภาษาสมัยใหม่แล้วไม่เพราะคอมไพเลอร์ที่เชี่ยวชาญมีอยู่สำหรับ "ทุก [เมเจอร์] แพลตฟอร์ม" และเราไม่ควรกีดกันตัวเองของคุณสมบัติเพียงเพื่อประคับประคองผู้ที่คอมไพเลอร์หรือห้องสมุดยังล้าหลัง ด้วยคอมไพเลอร์ที่ดีมาตรฐาน C / ++ และห้องสมุดข้ามแพลตฟอร์มเราสามารถมากมายขั้นสูง
underscore_d

34

จากมุมมองของการย้ายโปรแกรม 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 เพื่อควบคุมคอนโซล

อย่างไรก็ตาม:

  • ในฐานะที่เป็นเครื่องมือในการพัฒนา Windows แบบดั้งเดิม Cygwin มีนิสัยใจคอบางอย่างเช่นการจัดการเส้นทางที่ต่างกับ Windows การพึ่งพาเส้นทางแบบฮาร์ดโค้ดบางอย่างเช่น/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


2
คำตอบที่ยอดเยี่ยม การแสดงสิ่งที่เกิดขึ้นเมื่อรวบรวมชิ้นส่วนรหัสเดียวกันเชื่อมโยงและดำเนินการในแต่ละสภาพแวดล้อมทั้ง 3 เป็นกุญแจสำคัญและชี้แจงความแตกต่าง
drlolly

@Kaz การพัฒนานั้นเป็นอย่างไร เสียงซ้ำ แต่ดูเหมือนว่าจะตายตั้งแต่อย่างน้อยหนึ่งปี ทำไมคุณไม่ใช้ GitHub เพื่อให้ผู้คนสามารถช่วยเหลือและมีส่วนร่วมได้?
not2qubit

2
@ not2qubit ฉันรู้สึกว่าฉันสามารถควบคุมโครงการของฉันได้ดีกว่าเมื่อโฮสต์บนเซิร์ฟเวอร์ของฉันที่ฉันควบคุมตัวเอง ฉันใช้คอมไพล์ พื้นที่เก็บข้อมูลสามารถดึง ฉันสามารถรับคำขอดึงทางอีเมล (ตามที่ Linus Torvalds ออกแบบไว้) ฉันยังสามารถให้บัญชีที่มีสิทธิ์ในการมอบสิทธิ์ให้กับคนที่เป็นผู้สนับสนุนระดับผู้ดูแล Cygnal ทำงานได้ดี; ฉันรวมมันเป็นประจำในภาษา Windows รุ่นใหม่ของ TXR ฉันจะลด Cygnal ให้เป็น Cygwin พื้นฐานที่ใหม่กว่าในช่วงต้นปี 2562
Kaz

@ not2qubit โปรดทราบว่าทั้งหมด 17 เรื่องในวาระ Cygnal เป็นไปตามที่ได้ระบุไว้ ไม่มีใครแนะนำข้อกำหนดใหม่ใด ๆ หรือร้องเรียนเกี่ยวกับวิธีการจัดการทั้ง 17 ข้อ ดังนั้นจึงไม่จำเป็นต้องมีการพัฒนาอื่นนอกจากการรีบูตเป็น Cygwin ที่ใหม่กว่าซึ่งไม่ได้เป็นเรื่องเร่งด่วนอย่างมาก
Kaz

27

Wikipedia กล่าวว่า :

MinGWคดเคี้ยวจากรุ่น 1.3.3 Cygwinของ แม้ว่าทั้งสองCygwin และMinGWสามารถนำมาใช้กับพอร์ตUNIXซอฟต์แวร์เพื่อWindowsที่พวกเขามีวิธีการที่แตกต่างกันCygwinมีจุดมุ่งหมายที่จะให้สมบูรณ์แบบPOSIX layer ที่ให้ emulations ของสายหลายระบบและห้องสมุดที่มีอยู่บนLinux, UNIXและBSDสายพันธุ์ POSIX layer ทำงานบนWindowsเสียสละประสิทธิภาพการทำงานที่จำเป็นสำหรับการทำงานร่วมกัน ดังนั้นวิธีการนี้ต้องใช้ Windowsโปรแกรมที่เขียนด้วยCygwinเพื่อทำงานบนของห้องสมุดความเข้ากันได้ copylefted source codeที่จะต้องกระจายกับโปรแกรมพร้อมกับโปรแกรม มีจุดมุ่งหมายเพื่อให้การทำงานพื้นเมืองและประสิทธิภาพการทำงานที่ผ่านโดยตรงMinGW Windows 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 applications MinGW-GCC under POSIX systemsซึ่งหมายความว่านักพัฒนาไม่จำเป็นต้องมีการติดตั้ง Windows ด้วยMSYSซอฟต์แวร์รวบรวมที่จะทำงานในโดยไม่ต้องWindowsCygwin


2
ไม่ แน่นอน"ซับซ้อนกว่าในการติดตั้งและบำรุงรักษา" ! ใช้apt-cygงานได้ง่ายกว่าใช้ apt ภายใต้ WSL
not2qubit

14

อย่ามองข้ามซอฟต์แวร์U / Winของ AT&Tซึ่งได้รับการออกแบบมาเพื่อช่วยให้คุณรวบรวมแอปพลิเคชั่น Unix บน windows (เวอร์ชันล่าสุด - 2012-08-06; ใช้ Eclipse Public License, เวอร์ชั่น 1.0)

เช่นเดียวกับ Cygwin พวกเขาต้องวิ่งไปที่ห้องสมุด POSIX.DLLในกรณีของพวกเขา พวก AT&T เป็นวิศวกรที่ยอดเยี่ยม (กลุ่มเดียวกันที่นำ ksh และdotมาให้คุณ) และสิ่งของต่างๆของพวกเขานั้นคุ้มค่าที่จะเช็คเอาท์


4
ว้าวนี่เป็นหน้าเว็บที่ไม่ดี ในที่สุดฉันก็สามารถค้นหาลิงค์ดาวน์โหลดได้ที่www2.research.att.com/sw/downloadแต่ไม่มีเอกสารหรือข้อมูลออนไลน์เกี่ยวกับโครงการ
Fantius

1
ในขณะที่ข้อมูลมีประโยชน์ฉันรู้สึกว่านี่อาจเป็นคำตอบสำหรับคำถามทางเลือกสำหรับ MingW หรือ Cygwin มากกว่าคำถามนี้
Vivek

12

คำตอบอื่น ๆ ได้เข้าถึงกลุ่มเป้าหมายแล้ว ฉันแค่อยากจะเพิ่มภาพประกอบเพื่อความรวดเร็ว

ป้อนคำอธิบายรูปภาพที่นี่


11

Cygwin จำลองสภาพแวดล้อม POSIX ทั้งหมดในขณะที่ MinGW เป็นชุดเครื่องมือขั้นต่ำสำหรับการรวบรวมเท่านั้น (รวบรวมแอปพลิเคชั่น Win ดั้งเดิม) ดังนั้นหากคุณต้องการทำให้โครงการข้ามแพลตฟอร์มของคุณเป็นทางเลือกระหว่างสองอย่างชัดเจน MinGW

แม้ว่าคุณอาจพิจารณาใช้ VS บน Windows แต่ GCC บน Linux / Unices โครงการโอเพ่นซอร์สส่วนใหญ่ทำเช่นนั้น (เช่น Firefox หรือ Python)


"ส่วนใหญ่" ดูเหมือนคำพังพอนที่ไม่มีความหมายที่นี่โดยเฉพาะอย่างยิ่งมีเพียง 2 ตัวอย่างเท่านั้นและไม่มีสถิติ โครงการ FOSS จำนวนมากโยนแฟ้มโครงการ VS เป็นท่าทางโทเค็นฉันสงสัยว่ามีความแม่นยำมากขึ้น แต่ถ้าหากประสบการณ์ที่ผ่านมาเป็นสิ่งที่ต้องทำ GCC หรือ Clang นั้นปลอดภัยกว่าเพราะ VS มักจะล้าหลังอย่างมากเมื่อมาตรฐานทางภาษาพัฒนาขึ้น
underscore_d

นั่นเป็นคำตอบจากปี 2009 ทุกวันนี้ทุกสิ่งดูเยือกเย็นยิ่งขึ้นสำหรับ GCC สำหรับ "ส่วนใหญ่" ถ้าคุณวัดโดยผลกระทบเพียงแค่ Firefox และ Chrome เพียงอย่างเดียวมีผู้ใช้มากกว่าสิ่งอื่นใด
vartec

2
สิ่งที่เปลี่ยนแปลงไปตั้งแต่เมื่อฉันตอบว่าตอนนี้clangเป็นโซลูชันข้ามแพลตฟอร์มที่ทำงานได้
vartec

9

โปรดทราบว่าลักษณะการทำงานของยูทิลิตี้อาจแตกต่างกันอย่างแท้จริงระหว่างสอง

ตัวอย่างเช่น Cygwin tar สามารถแยกได้ - เนื่องจาก fork () รองรับใน DLL - โดยที่รุ่น mingw ไม่สามารถทำได้ นี่เป็นปัญหาเมื่อพยายามรวบรวม mysql จากแหล่งที่มา


นี่คือเหตุผลว่าทำไมสภาพแวดล้อมที่รองรับ MinGW เช่น MSYS2 มี Cygwin หรือเลเยอร์ที่รองรับ POSIX เต็มรูปแบบสำหรับถั่วระดับต่ำและสลักเกลียวเครื่องมือที่จำเป็นในระหว่างการสร้าง จากนั้นการคอมไพล์และการเชื่อมโยงที่แท้จริงจะถูกทิ้งไว้จนถึงคอมไพเลอร์ MinGW ดั้งเดิม MSYS2 นั้นเนี้ยบจริงๆ
underscore_d

9

ในการใช้ Cygwin ในแอพพลิเคชั่นการค้า / กรรมสิทธิ์ / ไม่ใช่โอเพนซอร์ซคุณจะต้องแยกออกเป็นหมื่นดอลลาร์สำหรับ "การซื้อใบอนุญาต " จาก Red Hat สิ่งนี้จะทำให้ข้อกำหนดการออกใบอนุญาตมาตรฐานใช้ไม่ได้ในราคาแพง Google "cygwin ค่าใช้จ่ายใบอนุญาต" และดูผลลัพธ์แรก ๆ

สำหรับ mingw ไม่มีค่าใช้จ่ายเกิดขึ้นและใบอนุญาต (PD, BSD, MIT) ได้รับอนุญาตอย่างมาก ส่วนใหญ่คุณอาจคาดว่าจะให้รายละเอียดใบอนุญาตกับใบสมัครของคุณเช่นใบอนุญาต winpthreads ที่จำเป็นเมื่อใช้ mingw64-tdm

แก้ไขเนื่องจาก Izzy Helianthus:สิทธิ์การใช้งานเชิงพาณิชย์ไม่สามารถใช้งานได้อีกต่อไปหรือจำเป็นเพราะห้องสมุด API ที่พบในไดเรกทอรีย่อย winsup ของ Cygwin ได้รับการเผยแพร่ภายใต้ LGPL เมื่อเทียบกับ GPL แบบเต็ม


2
อัปเดตจากเว็บไซต์ Redhat (ลิงก์จาก "การกู้ยืมเงินซื้อใบอนุญาต" - 'ณ วันที่ 1 มีนาคม 2016 Red Hat ไม่ได้ขายใบอนุญาตซื้อกิจการเชิงพาณิชย์สำหรับ Cygwin อีกต่อไปใบอนุญาตการค้าไม่จำเป็นอีกต่อไปเพราะ Cygwin กระจายอยู่ภายใต้ Lesser GNU GPL (LGPL). '> จากเว็บไซต์ Cygwin ไลบรารี Cygwin ™ที่พบในไดเรกทอรีย่อย winsup ของซอร์สโค้ดอยู่ภายใต้ GNU Lesser General Public License (LGPL) เวอร์ชัน 3 หรือใหม่กว่าสำหรับรายละเอียดข้อกำหนดของ LGPLv3 โปรดอ่าน GNU Lesser General Public License (LGPL)
Izzy Helianthus

6

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 สามารถใช้ได้ทั้งในโปรแกรมโอเพนซอร์ซและโอเพนซอร์สเนื่องจากส่วนหัวและไลบรารีได้รับอนุญาตให้ใช้สิทธิ


3

Cygwinเป็นสภาพแวดล้อมแบบ Unix และอินเตอร์เฟสบรรทัดคำสั่งสำหรับ Microsoft Windows

Mingwเป็นพอร์ตซอฟต์แวร์ดั้งเดิมของ GNU Compiler Collection (GCC) ไปยัง Microsoft Windows พร้อมกับชุดของไลบรารีการนำเข้าที่สามารถแจกจ่ายได้อย่างอิสระและไฟล์ส่วนหัวสำหรับ Windows API MinGW อนุญาตให้นักพัฒนาสร้างแอปพลิเคชัน Microsoft Windows ดั้งเดิม

คุณสามารถเรียกใช้ไบนารีที่สร้างmingwโดยไม่มีcygwinสภาพแวดล้อมโดยมีเงื่อนไขว่ามีไลบรารีที่จำเป็นทั้งหมด (DLLs) อยู่


1

Cygwinใช้เลเยอร์ความเข้ากันได้ในขณะที่MinGWเป็นพื้นเมือง นั่นคือหนึ่งในความแตกต่างที่สำคัญ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.