2012-03-07 36 views
5

Tôi tự hỏi trong tình huống nào người ta sử dụng Cygwin để biên dịch mã C và khi nào thì người ta chọn MinGW. Tôi đã đến trên What is the difference between Cygwin and MinGW? mô tả sự khác biệt giữa Cygwin và MinGW.Khi nào sử dụng Cygwin hoặc MinGW để biên dịch mã C?

Theo như tôi hiểu, người ta có thể nói như sau:

  • Cygwin: Cho phép biên dịch C mã nguồn cho POSIX hệ điều hành phù hợp để chạy trên Windows (yêu cầu cygwin1.dll). Ví dụ, tôi có thể biên dịch một ứng dụng bằng cách sử dụng API pthreads cho Windows, mặc dù bản thân Windows không triển khai API.
  • MinGW: Cho phép biên dịch mã nguồn C tuân thủ của Windows. Vì vậy, bằng cách sử dụng ví dụ từ trên, tôi không thể sử dụng API pthreads khi biên dịch với gcc trong MinGW nhưng sẽ được yêu cầu sử dụng API luồng do Windows cung cấp. Thay vì sử dụng trình biên dịch gcc MinGW, tôi cũng có thể sử dụng trình biên dịch khác, ví dụ: cái đi kèm với VC++.

Tuy nhiên, hiểu biết của tôi có vẻ sai, bởi vì tôi đã có thể biên dịch một chương trình giả bao gồm pthread.h với MinGW. Tôi đã hiểu gì sai?

Trả lời

3

Hiểu biết của bạn về cơ bản là chính xác. Tuy nhiên, có một cổng win32 pthreads, đó là một wrapper mỏng hơn API bản địa.

Ví dụ thích hợp hơn sẽ là fork(), không thể mô phỏng dễ dàng trên win32. Để làm như vậy, Cygwin thực thi bố cục bộ nhớ DLL cố định, và mọi thứ sẽ phát nổ nếu một thư viện không thể được tải nơi nó được cho là đi (cue rebaseall).

+0

Vì vậy, tôi cho rằng cổng win32 pthread này được bao gồm trong MinGW? – simon

+0

@simon: nó không sử dụng được, nhưng rõ ràng nó là một gói cơ sở MinGW kể từ 2010-02-18 (xem http://sourceforge.net/projects/mingw/files/MinGW/Base/pthreads-w32/) – Christoph

+0

@Christoph Cygwin không thực thi bố cục bộ nhớ DLL cố định như vậy, nhưng nó cần phải có khả năng nạp các tệp DLL trong một quá trình chia đôi tại cùng địa chỉ với cha mẹ. – ak2

Các vấn đề liên quan