Sự khác biệt giữa Cygwin và MinGW là gì?


653

Tôi muốn tạo dự án đa nền tảng cho dự án C ++ của mình và tôi đang xem xét sử dụng Cygwin / MinGW. Nhưng sự khác biệt giữa chúng là gì?

Một câu hỏi khác là liệu tôi có thể chạy nhị phân trên một hệ thống mà không cần Cygwin / MinGW không?

Câu trả lời:


624

Để đơn giản hóa, nó như thế này:

  • Biên dịch một cái gì đó trong Cygwin và bạn đang biên dịch nó cho Cygwin .

  • Biên dịch một cái gì đó trong MinGW và bạn đang biên dịch nó cho Windows .

Về Cygwin

Mục đích của Cygwin là làm cho việc chuyển các ứng dụng dựa trên Unix sang Windows dễ dàng hơn nhiều, bằng cách mô phỏng nhiều chi tiết nhỏ mà các hệ điều hành dựa trên Unix cung cấp và được ghi lại theo tiêu chuẩn POSIX . Ứng dụng của bạn có thể sử dụng tính năng Unix như ống dẫn, truy cập tệp và thư mục kiểu Unix, v.v. và nó có thể được biên dịch với Cygwin, nó sẽ hoạt động như một lớp tương thích xung quanh ứng dụng của bạn, để nhiều mô hình cụ thể của Unix có thể tiếp tục được sử dụng

Khi bạn phân phối phần mềm của mình, người nhận sẽ cần chạy phần mềm cùng với môi trường thời gian chạy Cygwin (được cung cấp bởi tệp cygwin1.dll). Bạn có thể phân phối phần mềm này với phần mềm của bạn, nhưng phần mềm của bạn sẽ phải tuân thủ giấy phép nguồn mở. Thậm chí có thể là trường hợp thậm chí chỉ liên kết phần mềm của bạn với nó, nhưng phân phối dll riêng biệt, vẫn có thể yêu cầu bạn tôn trọng giấy phép nguồn mở.

Giới thiệu về MinGW

MinGW nhằm mục đích đơn giản là một cổng Windows của các công cụ biên dịch GNU, như GCC, Make, Bash, v.v. Nó không cố gắng mô phỏng hoặc cung cấp khả năng tương thích toàn diện với Unix, nhưng thay vào đó, nó cung cấp môi trường cần thiết tối thiểu để sử dụng GCC (trình biên dịch GNU) và một số lượng nhỏ các công cụ khác trên Windows. Nó không có lớp mô phỏng Unix như Cygwin, nhưng kết quả là ứng dụng của bạn cần được lập trình cụ thể để có thể chạy trong Windows, điều này có thể có nghĩa là thay đổi đáng kể nếu nó được tạo ra để chạy trong môi trường Unix tiêu chuẩn và sử dụng các tính năng dành riêng cho Unix như các tính năng được đề cập trước đó. Theo mặc định, mã được biên dịch trong GCC của MinGW sẽ biên dịch sang mục tiêu Windows X86 riêng, bao gồm các tệp .exe và. Tuy nhiên, bạn cũng có thể biên dịch chéo với các cài đặt phù hợp, vì về cơ bản bạn đang sử dụng bộ công cụ biên dịch GNU.

MinGW về cơ bản là một sự thay thế cho trình biên dịch Microsoft Visual C ++ và các công cụ liên kết / tạo liên kết của nó. Trong một số trường hợp, có thể sử dụng MinGW để biên dịch thứ gì đó được dùng để biên dịch với Microsoft Visual C ++, với các thư viện phù hợp và trong một số trường hợp có sửa đổi khác.

MinGW bao gồm một số thư viện tiêu chuẩn cơ bản để tương tác với hệ điều hành Windows, nhưng với các thư viện tiêu chuẩn thông thường có trong bộ sưu tập trình biên dịch GNU, những điều này không áp đặt các hạn chế cấp phép đối với phần mềm bạn đã tạo.

Đối với các ứng dụng phần mềm không tầm thường, làm cho chúng trở thành đa nền tảng có thể là một thách thức đáng kể trừ khi bạn sử dụng khung đa nền tảng toàn diện. Vào thời điểm tôi viết bài này, khung Qt là một trong những khung phổ biến nhất cho mục đích này, cho phép xây dựng các ứng dụng đồ họa hoạt động trên các hệ điều hành bao gồm Windows, nhưng cũng có các tùy chọn khác. Nếu bạn sử dụng một khung như vậy ngay từ đầu, bạn không chỉ giảm đau đầu khi đến lúc chuyển sang nền tảng khác mà còn có thể sử dụng cùng các tiện ích đồ họa - cửa sổ, menu và điều khiển - trên tất cả các nền tảng nếu bạn đang viết Ứng dụng GUI và có chúng xuất hiện tự nhiên cho người dùng.


42
Bash đi kèm với MinGW không phải là một chương trình Windows gốc. Nó phụ thuộc vào MSYS DLL, một nhánh của Cygwin DLL. Tương tự đối với nhiều tiện ích Unix khác đi kèm với MinGW / MSYS. MinGW gcc thực sự là một chương trình bản địa mặc dù. Make có sẵn cả trong phiên bản gốc và MSYS.
ak2

5
bất kỳ sự khác biệt về tốc độ?
EKanadily

5
Sự khác biệt về tốc độ sẽ là không thể biết được trong hầu hết các tình huống. Bất kỳ sự khác biệt nào sẽ giảm xuống mức độ trừu tượng bổ sung được cung cấp bởi lớp tương thích cygwin làm mọi thứ chậm lại. Nó có thể có tác động có thể đo lường được đối với những thứ như I / O. Chẳng hạn, một thời gian dài trở lại, Git chỉ chạy trên Windows trong cygwin và do đó nó chậm hơn một chút. Sau đó, một lần nữa, nếu bạn viết mã bằng khung, đó cũng là một lớp trừu tượng với khả năng làm chậm một số thứ.
thomasrutter

27
Tôi nên lưu ý rằng mã được biên dịch cho cygwin vẫn là mã gốc - nó không cần phải chạy qua một trình thông dịch như nói Java. Chỉ là khi cần tương tác với một số tính năng nhất định của hệ điều hành như đĩa / tệp, nó sẽ chuyển qua lớp khác.
thomasrutter

3
Nói chung, bạn sẽ không thể so sánh, bởi vì bạn phải viết mã của mình khác nhau tùy thuộc vào việc nó có cho Cygwin hay không. Mặc dù đối với bất kỳ phần mềm nhỏ, đơn giản như "xin chào thế giới", tương đương cygwin sẽ lớn hơn chỉ vì thư viện thời gian chạy của Cygwin. Nếu bạn không đếm kích thước của thư viện thời gian chạy Cygwin, phiên bản cygwin thường sẽ nhỏ hơn nhưng đó là một con số sai tôi nghĩ rằng thư viện thực tế sẽ luôn cần được cung cấp cùng với phần mềm. Điều đó nói rằng, nếu bạn đang sử dụng bất kỳ thư viện / khung công tác không tầm thường thì nó sẽ phụ thuộc nhiều hơn vào điều đó.
thomasrutter

310

Cygwin là một nỗ lực để tạo ra một môi trường UNIX / POSIX hoàn chỉnh trên Windows. Để làm điều này, nó sử dụng các DLL khác nhau. Mặc dù các DLL này được bao phủ bởi GPLv3 +, giấy phép của chúng chứa một ngoại lệ không bắt buộc một tác phẩm phái sinh phải được bảo vệ bởi GPLv3 +. MinGW là bộ trình biên dịch C / C ++, cho phép bạn tạo các tệp thực thi Windows mà không phụ thuộc vào các DLL đó - bạn chỉ cần các thời gian chạy MSVC bình thường, là một phần của bất kỳ cài đặt Microsoft Windows thông thường nào.

Bạn cũng có thể có được một môi trường UNIX / POSIX nhỏ, được biên dịch với MinGW được gọi là MSYS . Nó không có bất cứ nơi nào gần tất cả các tính năng của Cygwin, nhưng lý tưởng cho các lập trình viên muốn sử dụng MinGW.


59
Nhưng nếu tôi muốn phát hành phần mềm không GPL miễn phí? Xin lỗi, tôi không phải là một fan hâm mộ GPL, là tất cả.

19
@Dan Bạn không cần phân phối lại thời gian chạy mà MinGW sử dụng - đó là một phần của Windows.

14
@ ak2: đó là sự thật, nhưng sai lệch. cygwyn gcc + môi trường cygwin mặc định để tạo ra các nhị phân được liên kết với dll cygwin (GPL). mingw + msys mặc định để tạo các nhị phân được liên kết với nền tảng C lib.
Sean McMillan

4
@DanMoulding Nếu bạn không phải là một người hâm mộ Microsoft, bạn sẽ phải bỏ qua những cảm xúc đó để phát triển cho Windows ngay từ đầu. ;-)
Arda Xi

14
@anon "Nhưng nếu tôi muốn phát hành phần mềm không phải GPL miễn phí?" .. cygwin có một ngoại lệ đặc biệt trong các điều khoản cam kết cho phép bạn phân phối phần mềm miễn phí được liên kết với nó theo các giấy phép nguồn mở khác (không phải GPL). Xem "Ngoại lệ cấp phép nguồn mở" tại đây: cygwin.com/licensing.html
steve cook

138

Để thêm vào các câu trả lời khác, Cygwin đi kèm với các thư viện và tiêu đề MinGW và bạn có thể biên dịch mà không cần liên kết với cygwin1.dll bằng cách sử dụng cờ -mno-cygwin với gcc. Tôi rất thích điều này để sử dụng MinGW và MSYS đơn giản.


31
Điều này không hoạt động nữa với cygwin 1.7.6. gcc: Cờ -mno-cygwin đã bị xóa; sử dụng một trình biên dịch chéo nhắm mục tiêu mingw.
sigjuice

2
@sigjuice: đúng, nhưng cờ -mno-cygwin cũ vẫn hoạt động cho GCC 3.x:gcc-3 -mno-cygwin
Amro

1
Vì vậy, điều này có nghĩa là tôi cần tải xuống các thư viện mingw từ trang web chính thức của mingw để biên dịch sang mục tiêu mingw từ máy chủ cygwin? Hoặc những thư viện này có thể được tải xuống từ hệ thống gói của Cygwin?
CMCDragonkai

5
@CMCDragonkai Bạn có thể có được trình biên dịch tương thích mingw từ trang Cygwin bằng cách chạy tiện ích thiết lập và tìm và đánh dấu chúng. Vì vậy, mặc dù gcc không còn tạo mã tương thích với mingw, nhưng trong Cygwin có thể chạy "mingw-gcc" (đó không phải là tên đầy đủ) để tạo ra loại thực thi tương tự mà trình biên dịch mingw sẽ theo msys.
người đàn ông không gian cardiff

9
Để sửa đổi câu trả lời hữu ích của cardiff, các gói và lệnh MinGW của Cygwin có tên hơi khó hiểu. Để cài đặt MinGW-64 ( khá nhiều thứ bạn luôn muốn, những ngày này ), hãy cài đặt mingw64-x86_64-gcc-coregói Cygwin. MinGW-64 sau đó sẽ có sẵn dưới dạng x86_64-w64-mingw32-gcclệnh được đặt tên vụng về . Xin Chúa, ai đó thống nhất tên của những thứ đẫm máu này.
Cecil Curry

60

Wikipedia có một so sánh ở đây .

Từ trang web của Cygwin :

  • Cygwin là một môi trường giống như Linux cho Windows. Nó bao gồm hai phần: Một DLL (cygwin1.dll) hoạt động như một lớp mô phỏng API Linux cung cấp chức năng API Linux đáng kể.
  • Một bộ sưu tập các công cụ cung cấp giao diện Linux.

Từ trang web của Mingw :

MinGW ("GNU tối giản cho Windows") là một tập hợp các tệp tiêu đề và thư viện nhập cụ thể của Windows có thể phân phối miễn phí và kết hợp với các bộ công cụ GNU cho phép một người tạo các chương trình Windows gốc không dựa vào bất kỳ DLL thời gian chạy C của bên thứ 3 nào


47

Cygwin sử dụng một DLL, cygwin.dll, (hoặc có thể là một tập hợp các DLL) để cung cấp thời gian chạy giống như POSIX trên Windows.

MinGW biên dịch thành ứng dụng Win32 gốc.

Nếu bạn xây dựng một cái gì đó với Cygwin, bất kỳ hệ thống nào bạn cài đặt nó cũng sẽ cần (các) DLL Cygwin. Một ứng dụng MinGW không cần bất kỳ thời gian chạy đặc biệt nào.


42

Đọc những câu hỏi được trả lời này để hiểu sự khác biệt giữa Cygwin và MinGW.


Câu hỏi số 1: Tôi muốn tạo một ứng dụng mà tôi viết mã nguồn một lần, biên dịch nó một lần và chạy nó trong bất kỳ nền tảng nào (ví dụ: Windows, Linux và Mac OS X mộc).

Câu trả lời số 1: Viết mã nguồn của bạn trong JAVA. Biên dịch mã nguồn một lần và chạy nó ở bất cứ đâu.


Câu hỏi số 2: Tôi muốn tạo một ứng dụng mà tôi viết mã nguồn một lần nhưng không có vấn đề gì khi tôi biên dịch mã nguồn cho bất kỳ nền tảng nào một cách riêng biệt (ví dụ: Windows, Linux và Mac OS X,).

Câu trả lời số 2: Viết mã nguồn của bạn bằng C hoặc C ++. Chỉ sử dụng tệp tiêu đề. Sử dụng trình biên dịch phù hợp cho mọi nền tảng (ví dụ Visual Studio cho Windows, GCC cho Linux và XCode cho Mac). Lưu ý rằng bạn không nên sử dụng bất kỳ tính năng lập trình nâng cao nào để biên dịch mã nguồn của mình trong tất cả các nền tảng thành công. Nếu bạn không sử dụng các lớp hoặc hàm tiêu chuẩn C hoặc C ++, mã nguồn của bạn sẽ không biên dịch trong các nền tảng khác.


Câu hỏi số 3: Trong câu trả lời của câu hỏi số 2, rất khó sử dụng trình biên dịch khác nhau cho mỗi nền tảng, có trình biên dịch đa nền tảng nào không?

Trả lời # 3: Có, Sử dụng trình biên dịch GCC. Nó là một trình biên dịch đa nền tảng. Để biên dịch mã nguồn của bạn trong Windows, hãy sử dụng MinGW cung cấp trình biên dịch GCC cho Windows và biên dịch mã nguồn của bạn sang chương trình Windows gốc. Không sử dụng bất kỳ tính năng lập trình nâng cao nào (như API Windows) để biên dịch mã nguồn của bạn trong tất cả các nền tảng thành công. Nếu bạn sử dụng các hàm Windows API, mã nguồn của bạn sẽ không biên dịch trong các nền tảng khác.


Câu hỏi số 4: Các tệp tiêu đề chuẩn C hoặc C ++ không cung cấp bất kỳ tính năng lập trình nâng cao nào như đa luồng. Tôi có thể làm gì?

Trả lời # 4: Bạn nên sử dụng tiêu chuẩn POSIX (Giao diện hệ điều hành di động [cho UNIX]). Nó cung cấp nhiều tính năng và công cụ lập trình tiên tiến. Nhiều hệ điều hành tương thích hoàn toàn hoặc một phần POSIX (như Mac OS X, Solaris, BSD / OS và ...). Một số hệ điều hành trong khi không được chứng nhận chính thức là tương thích POSIX, phù hợp với phần lớn (như Linux, FreeBSD, OpenSolaris và ...). Cygwin cung cấp môi trường thời gian chạy và thời gian chạy phần lớn tuân thủ POSIX cho Microsoft Windows.


Như vậy:

Để sử dụng lợi thế của trình biên dịch đa nền tảng GCC trong Windows, hãy sử dụng MinGW.

Để sử dụng lợi thế của các tính năng và công cụ lập trình nâng cao tiêu chuẩn POSIX trong Windows, hãy sử dụng Cygwin.


4
Giới thiệu về faq nhỏ của bạn: 1) Quyền của bạn, nếu bạn cần một cái gì đó chạy ở bất cứ đâu và không cần phải biên dịch, hãy chọn một cái gì đó như java (cũng đừng quên python, perl, ruby ​​và phần còn lại của ngôn ngữ script) 2) Điều này hơi sai đối với trường hợp của C, vì tất cả các trình biên dịch của C, hỗ trợ nó rất tốt. 3) Bạn vẫn có thể sử dụng win32 api, nhưng bạn phải bọc nó trong một lớp tính di động, vì vậy đó chỉ là một vấn đề thiết kế.
Coyote21

1
4) Điều này hoàn toàn sai, vì những lý do tôi đưa ra ở trên, vì POSIX chỉ là api khác, nếu bạn bảo vệ quá nhiều POSIX, bạn nên biết rằng ngay cả Unices cũng không cần phải thực hiện cùng một bộ POSIX, vậy làm thế nào Bạn có đối phó với điều đó? Api POSIX thời gian thực đến với tâm trí. Và điều đó khiến bạn kết luận hoàn toàn không có thật và sai, vì bạn không cần POSIX cho bất cứ điều gì trong windows, bạn chỉ có thể sử dụng API Win32. Hoặc làm thế nào để bạn nghĩ rằng Qt, GTK và WxWidgets đã tìm ra một cách để đa nền tảng, tôi đoán rằng tất cả họ phải sử dụng cygwin trong các cửa sổ. -1 phiếu cho câu trả lời của bạn.
Coyote21

4
Tôi không hiểu lý lẽ của bạn, @ Coyote21. Bạn đang nói rằng POSIX không phù hợp để phát triển đa nền tảng? Bạn có nói rằng cách thích hợp duy nhất để viết mã trong C / C ++ cho nhiều nền tảng là viết lớp tương thích của riêng bạn cho mỗi nền tảng bạn muốn hỗ trợ? Tôi không thấy có gì sai với đề xuất bắt đầu với POSIX. Bạn cần phải xem nó có thể giúp bạn đi được bao xa và liệu có cần một giải pháp lớp tương thích mở rộng hay không. Các lớp tương thích lớn không phải là tiêu chuẩn. Nói cách khác là cho rằng POSIX là một thất bại hoàn toàn.
David Gladfelter

Đa luồng được thực hiện thông qua lớp POSIX ngay cả trong MinGW.
Alexander Shishenko

1
"bạn không nên sử dụng bất kỳ tính năng lập trình nâng cao nào để biên dịch mã nguồn của mình trong tất cả các nền tảng thành công." Bạn thực sự cần phải làm rõ những gì bạn có nghĩa là "tính năng lập trình nâng cao". Dựa trên một dòng sau, tôi đoán bạn thực sự có nghĩa là các tính năng dành riêng cho nền tảng . Nếu bạn có nghĩa là các tính năng ngôn ngữ hiện đại thì không, bởi vì các trình biên dịch có thẩm quyền tồn tại cho "tất cả các nền tảng [chính]" và chúng ta không nên tự tước đi các tính năng chỉ để chống đỡ những trình biên dịch hoặc thư viện vẫn bị tụt lại phía sau. Với một trình biên dịch tốt, C / ++ tiêu chuẩn và các thư viện đa nền tảng, chúng ta có thể tiến bộ rất nhiều .
gạch dưới

33

Từ quan điểm chuyển một chương trình C, một cách tốt để hiểu điều này là lấy một ví dụ:

#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;
}

Nếu chúng tôi thay đổi statthành _stat, chúng tôi có thể biên dịch chương trình này với Microsoft Visual C. Chúng tôi cũng có thể biên dịch chương trình này với MinGW và với Cygwin.

Trong Microsoft Visual C, chương trình sẽ được liên kết với thư viện thời gian chạy phân phối lại MSVC : mxvcrtnn.dll, trong đó nncó một số hậu tố phiên bản. Để gửi chương trình này, chúng tôi sẽ phải bao gồm DLL đó. DLL đó cung cấp _stat, systemprintf. (Chúng tôi cũng có tùy chọn liên kết tĩnh thời gian chạy.)

Theo MinGW, chương trình sẽ được liên kết đến msvcrt.dll , đây là một thư viện nội bộ, không có giấy tờ, không bị đảo ngược, là một phần của Windows và không giới hạn sử dụng ứng dụng. Thư viện đó thực chất là một nhánh của thư viện thời gian chạy có thể phân phối lại từ MS Visual C để sử dụng cho chính Windows.

Theo cả hai điều này, chương trình sẽ có những hành vi tương tự nhau:

  • chẳng hạn, statchức năng sẽ trả về thông tin rất hạn chế, không có quyền hoặc số inode hữu ích.
  • đường dẫn c:file.txtđược giải quyết theo thư mục làm việc hiện tại được liên kết với ổ đĩa c:.
  • systemsử dụng cmd.exe /cđể chạy lệnh bên ngoài.

Chúng tôi cũng có thể biên dịch chương trình theo Cygwin. Tương tự như thời gian chạy có thể phân phối lại được sử dụng bởi MS Visual C, chương trình Cygwin sẽ được liên kết với các thư viện thời gian chạy của Cygwin: cygwin1.dll(Cygwin thích hợp) và cyggcc_s-1.dll(hỗ trợ thời gian chạy GCC). Vì Cygwin hiện thuộc LGPL, chúng tôi có thể đóng gói với chương trình của chúng tôi, ngay cả khi đó không phải là phần mềm miễn phí tương thích GPL và gửi chương trình.

Theo Cygwin, các chức năng thư viện sẽ hoạt động khác nhau:

  • các statchức năng có chức năng phong phú, trở về giá trị có ý nghĩa trong hầu hết các lĩnh vực.
  • đường dẫn hoàn toàn c:file.txtkhông được hiểu là chứa tham chiếu ký tự ổ đĩa, vì c:không được theo sau bởi dấu gạch chéo. Dấu hai chấm được coi là một phần của tên và bằng cách nào đó đọc vào nó. Không có khái niệm về một đường dẫn tương đối so với ổ đĩa hoặc ổ đĩa trong Cygwin, không có khái niệm "ổ đĩa hiện tại được ghi lại" và không có thư mục làm việc hiện tại trên mỗi ổ đĩa.
  • các systemchức năng cố gắng sử dụng các /bin/sh -cthông dịch viên. Cygwin sẽ giải quyết /đường dẫn theo vị trí thực thi của bạn và mong muốn một sh.exechương trình được đặt cùng với tệp thực thi của bạn.

Cả Cygwin và MinGW đều cho phép bạn sử dụng các chức năng Win32. Nếu bạn muốn gọi MessageBoxhoặc CreateProcess, bạn có thể làm điều đó. Bạn cũng có thể dễ dàng xây dựng một chương trình không yêu cầu cửa sổ giao diện điều khiển, sử dụng gcc -mwindows, dưới MinGW và Cygwin.

Cygwin không hoàn toàn POSIX. Ngoài việc cung cấp quyền truy cập vào API Windows, nó cũng cung cấp các triển khai riêng của một số chức năng Microsoft C (nội dung được tìm thấy trong msvcrt.dllhoặc msvcrtnn.dllthời gian chạy lại có thể phân phối lại ). Một ví dụ về điều này là spawn*gia đình của các chức năng như thế nào spawnvp. Đây là một ý tưởng tốt để sử dụng thay vì forkexectrên Cygwin vì chúng ánh xạ tốt hơn đến mô hình tạo quy trình Windows không có khái niệm fork.

Như vậy:

  • Các chương trình Cygwin không kém "bản địa" so với các chương trình MS Visual C với lý do yêu cầu đệm thư viện. Việc triển khai ngôn ngữ lập trình trên Windows dự kiến ​​sẽ cung cấp thời gian thực hiện, thậm chí là triển khai ngôn ngữ C. Không có "libc" trên Windows để sử dụng công cộng.

  • Việc MinGW không yêu cầu DLL của bên thứ ba thực sự là một bất lợi; nó phụ thuộc vào một ngã ba nội bộ Windows không có giấy tờ của thời gian chạy Visual C. MinGW thực hiện điều này bởi vì ngoại lệ thư viện hệ thống GPL áp dụng msvcrt.dll, điều đó có nghĩa là các chương trình GPL có thể được biên dịch và phân phối lại với MinGW.

  • Do sự hỗ trợ rộng rãi và sâu sắc hơn nhiều cho POSIX so với msvcrt.dll, Cygwin cho đến nay là môi trường ưu việt để chuyển các chương trình POSIX. Vì hiện tại thuộc LGPL, nó cho phép các ứng dụng với tất cả các loại giấy phép, nguồn mở hoặc đóng, được phân phối lại. Cygwin thậm chí còn có phần mô phỏng VT100 và termios, hoạt động với bảng điều khiển của Microsoft! Ứng dụng POSIX thiết lập chế độ thô với tcsetattrvà sử dụng mã VT100 để điều khiển con trỏ sẽ hoạt động ngay trong cmd.execửa sổ. Đối với người dùng cuối, đây là một ứng dụng bảng điều khiển gốc thực hiện các cuộc gọi Win32 để điều khiển bảng điều khiển.

Tuy nhiên:

  • Là một công cụ phát triển Windows gốc, Cygwin có một số điểm kỳ quặc, như xử lý đường dẫn xa lạ với Windows, phụ thuộc vào một số đường dẫn được mã hóa cứng như /bin/shvà các vấn đề khác. Những khác biệt này là những gì làm cho các chương trình Cygwin "không bản địa". Nếu một chương trình lấy một đường dẫn làm đối số hoặc nhập từ hộp thoại, người dùng Windows mong muốn đường dẫn đó hoạt động giống như trong các chương trình Windows khác. Nếu nó không hoạt động theo cách đó, đó là một vấn đề.

Plug: Ngay sau thông báo LGPL, tôi đã bắt đầu dự án Cygnal (Thư viện ứng dụng gốc Cygwin) để cung cấp một nhánh của DLL Cygwin nhằm khắc phục các vấn đề này. Các chương trình có thể được phát triển theo Cygwin, và sau đó được triển khai với phiên bản Cygnal cygwin1.dllmà không cần biên dịch lại. Khi thư viện này được cải thiện, nó sẽ dần dần loại bỏ nhu cầu về MinGW.

Khi Cygnal giải quyết vấn đề xử lý đường dẫn, có thể phát triển một tệp thực thi duy nhất hoạt động với các đường dẫn Windows khi được vận chuyển dưới dạng một ứng dụng Windows với Cygnal và hoạt động liền mạch với các đường dẫn Cygwin khi được cài đặt trong /usr/binCygwin của bạn . Theo Cygwin, tệp thực thi sẽ hoạt động trong suốt với một đường dẫn như thế nào /cygdrive/c/Users/bob. Trong triển khai gốc nơi liên kết với phiên bản Cygnal cygwin1.dll, đường dẫn đó sẽ không có ý nghĩa, trong khi nó sẽ hiểu c:foo.txt.


2
Câu trả lời tuyệt vời. Hiển thị những gì xảy ra khi cùng một đoạn mã được biên dịch, liên kết và thực thi trong mỗi 3 môi trường là chìa khóa và làm rõ sự khác biệt.
drlolly

@Kaz Sự phát triển đó diễn ra như thế nào? Âm thanh lặp đi lặp lại nhưng dường như đã chết từ ít nhất một năm trước. Tại sao bạn không sử dụng GitHub để mọi người có thể giúp đỡ và tham gia?
not2qubit

2
@ not2qubit Tôi cảm thấy tôi kiểm soát tốt hơn các dự án của mình khi chúng được lưu trữ trên máy chủ của riêng tôi mà tôi tự kiểm soát. Tôi đang sử dụng git; kho có thể được kéo. Tôi có thể chấp nhận các yêu cầu kéo qua e-mail (như Linus Torvalds đã thiết kế chúng). Tôi cũng có thể cung cấp một tài khoản với các đặc quyền cam kết cho một người nào đó trở thành người đóng góp ở cấp độ bảo trì. Cygnal hoạt động tốt; Tôi thường xuyên gói nó trong các phiên bản Windows của phiên bản mới của ngôn ngữ TXR. Tôi sẽ phản hồi Cygnal nó thành một đường cơ sở Cygwin mới hơn vào khoảng đầu năm 2019.
Kaz

@ not2qubit Lưu ý rằng tất cả 17 vấn đề trong chương trình nghị sự của Cygnal đều được giải quyết. Không ai đã đề xuất bất kỳ yêu cầu mới, hoặc phàn nàn về cách xử lý 17. do đó, không có sự phát triển nào được yêu cầu ngoài việc nổi loạn lên Cygwin mới hơn, điều này không quá cấp bách.
Kaz

27

Wikipedia nói :

MinGWrẽ nhánh từ phiên bản 1.3.3 của Cygwin. Mặc dù cả hai CygwinMinGWcó thể được sử dụng để cổng UNIXphần mềm để Windows, họ có cách tiếp cận khác nhau: Cygwinmục đích để cung cấp hoàn toàn POSIX layer cung cấp độ giả lập của một số cuộc gọi hệ thống và thư viện mà tồn tại trên Linux, UNIXvà các BSDbiến thể. Việc POSIX layer chạy trên đầu trang Windows, hy sinh hiệu suất khi cần thiết để tương thích. Theo đó, cách tiếp cận này yêu cầu Windowscác chương trình được viết Cygwinđể chạy trên đầu thư viện tương thích sao chép phải được phân phối cùng với chương trình, cùng với chương trình source code. MinGWnhằm mục đích cung cấp chức năng và hiệu suất bản địa thông qua trực tiếp Windows API calls. Không giống như Cygwin,MinGWkhông yêu cầu lớp tương thích DLLvà do đó các chương trình không cần phải được phân phối source code.

Bởi vì MinGWphụ thuộc vào Windows API calls, nó không thể cung cấp đầy đủ POSIX API; nó không thể biên dịch một số UNIX applicationscó thể được biên dịch với Cygwin. Cụ thể, điều này áp dụng cho các ứng dụng đòi hỏi phải có POSIXchức năng như fork(), mmap()hay ioctl()và những người mong đợi để được chạy trong một POSIX environment. Ứng dụng được viết bằng cách sử dụng cross-platform librarymà đã tự được chuyển đến MinGW, chẳng hạn như SDL, wxWidgets, Qt, hay GTK+, thường sẽ biên dịch một cách dễ dàng trong MinGWkhi họ sẽ ở Cygwin.

Sự kết hợp MinGWMSYScung cấp một môi trường nhỏ, khép kín có thể được tải lên phương tiện lưu động mà không để lại các mục trong sổ đăng ký hoặc tệp trên máy tính. CygwinPortable cung cấp một tính năng tương tự. Bằng cách cung cấp nhiều chức năng hơn, Cygwin trở nên phức tạp hơn để cài đặt và bảo trì.

Nó cũng có thể cross-compile Windows applicationsvới MinGW-GCC under POSIX systems. Điều này có nghĩa là các nhà phát triển không cần cài đặt Windows MSYSđể biên dịch phần mềm sẽ chạy Windowsmà không cần Cygwin.


2
Nó chắc chắn không "phức tạp hơn để cài đặt và bảo trì" ! Sử dụng apt-cygvì có lẽ còn dễ hơn sử dụng apt trong WSL.
not2qubit

14

Đừng bỏ qua phần mềm U / Win của AT & T , được thiết kế để giúp bạn biên dịch các ứng dụng Unix trên windows (phiên bản mới nhất - 2012-08-06; sử dụng Giấy phép công cộng Eclipse, Phiên bản 1.0).

Giống như Cygwin, họ phải chạy đua với một thư viện; trong trường hợp của họ POSIX.DLL. Các anh chàng AT & T là những kỹ sư tuyệt vời (cùng nhóm đã mang đến cho bạn ksh và dot ) và nội dung của họ rất đáng để kiểm tra.


4
Wow, đó là một số trang web xấu. Cuối cùng tôi đã có thể tìm thấy một liên kết tải xuống tại www2.research.att.com/sw/doad , nhưng không có tài liệu hoặc thông tin trực tuyến nào về dự án.
Fantius

1
Mặc dù thông tin hữu ích, tôi cảm thấy đây có thể là câu trả lời cho một câu hỏi về các lựa chọn thay thế cho MingW hoặc Cygwin thay vì câu hỏi này.
Vivek

12

Các câu trả lời khác đã đạt được mục tiêu. Tôi chỉ muốn thêm một minh họa để nắm bắt nhanh chóng.

nhập mô tả hình ảnh ở đây


11

Cygwin mô phỏng toàn bộ môi trường POSIX, trong khi MinGW là công cụ tối thiểu được thiết lập chỉ để biên dịch (biên dịch ứng dụng Win gốc.) Vì vậy, nếu bạn muốn làm cho dự án của mình đa nền tảng, sự lựa chọn giữa hai là rõ ràng, MinGW.

Mặc dù bạn có thể cân nhắc sử dụng VS trên Windows, GCC trên Linux / Unices. Hầu hết các dự án nguồn mở làm điều đó (ví dụ Firefox hoặc Python).


"Hầu hết" có vẻ như là một từ chồn vô nghĩa ở đây, đặc biệt chỉ có 2 ví dụ và không có số liệu thống kê. Nhiều dự án FOSS ném vào một tệp dự án VS như một cử chỉ mã thông báo, tôi nghi ngờ là chính xác hơn. Nhưng nếu kinh nghiệm trong quá khứ là bất cứ điều gì xảy ra, GCC hoặc Clang thường an toàn hơn vì VS có xu hướng tụt hậu đáng kể khi các tiêu chuẩn ngôn ngữ phát triển.
undererscore_d

Đó là một câu trả lời từ năm 2009. Ngày nay mọi thứ thậm chí còn ảm đạm hơn đối với GCC. Đối với "hầu hết", nếu bạn đo lường bằng tác động, thì chỉ riêng Firefox và Chrome có nhiều người dùng hơn bất kỳ thứ gì khác.
vartec

2
Điều đã thay đổi kể từ khi tôi trả lời là bây giờ clanglà một giải pháp đa nền tảng khả thi.
vartec

9

Lưu ý rằng hành vi tiện ích thực sự có thể khác nhau giữa hai.

Ví dụ, Cygwin tar có thể rẽ nhánh - vì fork () được hỗ trợ trong DLL - nơi phiên bản mingw không thể. Đây là một vấn đề khi cố gắng biên dịch mysql từ nguồn.


Đây là lý do tại sao các môi trường có khả năng MinGW hoàn chỉnh, ví dụ MSYS2, cung cấp lớp Cygwin hoặc lớp tương thích POSIX hoàn toàn khác cho các đai ốc và bu lông công cụ cấp thấp cần thiết trong quá trình xây dựng. Sau đó, quá trình biên dịch và liên kết thực tế được để lại cho trình biên dịch MinGW hoàn toàn tự nhiên. MSYS2 thực sự gọn gàng.
underscore_d

9

Để sử dụng Cygwin trong một ứng dụng thương mại / độc quyền / không phải nguồn mở, bạn sẽ cần bỏ ra hàng chục ngàn đô la để " mua giấy phép " từ Red Hat; điều này làm mất hiệu lực các điều khoản cấp phép tiêu chuẩn với chi phí đáng kể. Google "chi phí giấy phép cygwin" và xem một vài kết quả đầu tiên.

Đối với mingw, không có chi phí nào phát sinh và các giấy phép (PD, BSD, MIT) cực kỳ dễ dãi. Nhiều nhất bạn thể phải cung cấp chi tiết giấy phép với ứng dụng của mình, chẳng hạn như giấy phép winpthreads cần có khi sử dụng mingw64-tdm.

EDIT nhờ vào Izzy Helianthus: Giấy phép thương mại không còn có sẵn hoặc cần thiết vì thư viện API được tìm thấy trong thư mục con chiến thắng của Cygwin hiện đang được phân phối theo LGPL, trái ngược với GPL đầy đủ.


2
Một bản cập nhật từ trang web Redhat (liên kết từ "mua giấy phép" - 'Kể từ ngày 1 tháng 3 năm 2016 Red Hat không còn bán Giấy phép mua hàng thương mại cho Cygwin. Giấy phép thương mại không còn cần thiết vì Cygwin hiện đang được phân phối theo GNU Lesser GPL (LGPL). '> Từ trang web Cygwin Thư viện API Cygwin ™ được tìm thấy trong thư mục con winup của mã nguồn được bảo vệ bởi Giấy phép công cộng GNU (LGPL) phiên bản 3 trở lên. Để biết chi tiết về các yêu cầu của LGPLv3, vui lòng đọc Giấy phép Công cộng GNU (LGPL).
Izzy Helianthus

6

Cygwin được thiết kế để cung cấp một môi trường POSIX hoàn chỉnh ít nhiều cho Windows, bao gồm một bộ công cụ mở rộng được thiết kế để cung cấp một nền tảng giống như Linux đầy đủ. Trong khi đó, MinGW và MSYS cung cấp một trọng lượng nhẹ, nhỏ gọn POSIX giống như lớp, chỉ với những công cụ cần thiết giống như gccbashcó sẵn. Do cách tiếp cận tối giản hơn của MinGW, nó không cung cấp mức độ bao phủ API POSIX mà Cygwin cung cấp và do đó không thể xây dựng một số chương trình nhất định có thể được biên dịch trên Cygwin.

Về mặt mã do hai người tạo ra, chuỗi công cụ Cygwin dựa vào liên kết động với thư viện thời gian chạy lớn cygwin1.dll, trong khi chuỗi công cụ MinGW biên dịch mã thành các nhị phân liên kết động với thư viện C gốc của Windows msvcrt.dllcũng như tĩnh với các phần của glibc. Do đó, các tệp thực thi của Cygwin nhỏ gọn hơn nhưng yêu cầu một DLL phân phối lại riêng biệt, trong khi các nhị phân MinGW có thể được vận chuyển độc lập nhưng có xu hướng lớn hơn.

Việc các chương trình dựa trên Cygwin yêu cầu một DLL riêng để chạy cũng dẫn đến các hạn chế cấp phép. Thư viện thời gian chạy Cygwin được cấp phép theo GPLv3 với ngoại lệ liên kết cho các ứng dụng có giấy phép tuân thủ OSI, vì vậy các nhà phát triển muốn xây dựng một ứng dụng nguồn đóng xung quanh Cygwin phải có giấy phép thương mại từ Red Hat. Mặt khác, mã MinGW có thể được sử dụng trong cả ứng dụng nguồn mở và nguồn đóng, vì các tiêu đề và thư viện được cấp phép cho phép.


3

Cygwin là một môi trường và giao diện dòng lệnh giống như Unix cho Microsoft Windows.

Mingw là một cổng phần mềm riêng của Bộ sưu tập Trình biên dịch GNU (GCC) cho Microsoft Windows, cùng với một bộ thư viện nhập và các tệp tiêu đề có thể phân phối tự do cho API Windows. MinGW cho phép các nhà phát triển tạo các ứng dụng Microsoft Windows gốc.

Bạn có thể chạy các tệp nhị phân được tạo mingwmà không có cygwinmôi trường, miễn là tất cả các thư viện cần thiết (DLL) đều có mặt.


1

Cygwinsử dụng một lớp tương thích, trong khi MinGWlà bản địa. Đó là một trong những khác biệt chính.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.