2013-05-12 40 views
13

tôi nhận thấy rằng cả hai trình biên dịch của tôi (MinGW) và Windows 8 SDK đi kèm với các thư viện tương tự, tiết kiệm quy ước đặt tên (ví dụ win32.lib trên Windows 8 SDK là libwin32.a trong Thư viện MinGW).Compiler Thư viện vs Hệ điều hành Thư viện

  • Mọi trình biên dịch có đi kèm với các thư viện như vậy không?
  • Các thư viện này có dành cho nhiều hệ điều hành không?
  • Sự khác nhau (nếu có) giữa các thư viện đi kèm với Windows 8 SDK và các thư viện đi kèm với trình biên dịch là gì?
+0

+1 câu hỏi hay. Tôi thực sự gặp khó khăn trong việc tìm ra cách trả lời nó mặc dù tôi biết câu trả lời! – Mehrdad

Trả lời

7

Có hai loại thư viện:

  • thư viện nhập:
    Những thư viện chỉ danh sách nơi để tìm tài liệu tham khảo để biến/chức năng/etc, nhưng họ không chứa sự. mã.

  • Thư viện "bình thường" (chứa các tệp đối tượng chứa mã máy):
    Các thư viện này chứa các tệp đối tượng chứa mã máy thực tế.

Thư viện đi kèm với hệ điều hành thường là thư viện nhập.
Mã thực tế, sau khi tất cả, là trong chính hệ điều hành; các thư viện nhập khẩu chỉ cho bạn biết cách sử dụng mã được cung cấp trong hệ điều hành.
Tại sao điều này lại cần thiết? Vì không có cách nào để chương trình "khám phá" các thư viện có sẵn trên hệ điều hành khi đang chạy, vì vậy chương trình phải biết những gì sẽ có sẵn khi được biên dịch.

Những thứ đi kèm với trình biên dịch thường là thư viện mã; chúng chứa mã mà trình biên dịch yêu cầu (tùy thuộc vào trình biên dịch cụ thể của bạn) để biên dịch chương trình của bạn.

Tuy nhiên, không có "định dạng chuẩn" duy nhất cho thư viện; Microsoft sử dụng COFF, nhưng các công cụ * nix sử dụng ELF.
Vì vậy, khi Microsoft chuyển các thư viện nhập khẩu cho một hệ thống, nó chỉ gửi chúng trong định dạng COFF, rất tốt cho trình biên dịch Visual C++ - nhưng không hữu ích cho các trình biên dịch khác.

Điều này làm cho các nhà cung cấp trình biên dịch như MinGW bị buộc phải tạo riêng thư viện nhập khẩu đối với các hệ điều hành mà họ dự định để nhắm mục tiêu - mục đích của các thư viện này là chính xác giống như như những người được cung cấp bởi nhà cung cấp hệ điều hành (chẳng hạn như Microsoft), nhưng định dạng của họ là khác nhau.

Đó là lý do tại sao bạn thấy các thư viện có vẻ tương tự được cung cấp theo nhiều cách.

+0

Bạn nói rằng các trình biên dịch thường đi kèm với các thư viện mã, tuy nhiên sau đó bạn nói rằng vì không có định dạng được chấp nhận duy nhất nên các nhà cung cấp trình biên dịch phải tạo các thư viện nhập của riêng chúng. Điều này có vẻ mâu thuẫn, bạn có thể xây dựng được không? –

+1

@DavidHackett: * Mã * thư viện hầu như đi kèm với trình biên dịch, bởi vì hầu như mọi trình biên dịch cần bổ sung thêm mã được biên dịch trước vào chương trình để làm cho nó chạy đúng cách. * Các thư viện nhập * thường chỉ được vận chuyển với các trình biên dịch (như MinGW GCC) mà không hiểu định dạng (chẳng hạn như COFF) được cung cấp bởi nhà cung cấp hệ điều hành (chẳng hạn như Microsoft). – Mehrdad

+0

Cảm ơn bạn đã làm rõ! :) –

2

MinGW đi kèm với bộ thư viện SDK của riêng mình vì lý do đơn giản là MinGW dự định cung cấp trình biên dịch tự do có sẵn để sản xuất các chương trình Windows, nhưng Windows SDK không có sẵn theo ý nghĩa của các nhà phát triển MinGW /nhu cầu. Bởi vì giấy phép trên Microsoft Windows SDK, nó không phải là một cái gì đó mà chỉ đơn giản có thể được phân phối với trình biên dịch MinGW. Vì vậy, một phần quan trọng trong nỗ lực phát triển MinGW là tập hợp các tiêu đề và thư viện cung cấp chức năng Windows SDK mà không vi phạm các điều khoản cấp phép của Microsoft.

Một chút công bằng của MinGW WinSDK là miền công cộng (thậm chí có thể hầu hết hoặc tất cả). Tất cả đều là nguồn mở có thể phân phối tự do. Có thể cũng có vấn đề tương thích với MinGW khi sử dụng tệp và thư viện đối tượng MS, nhưng tôi rất ngạc nhiên khi thấy rằng MinGW thường có thể liên kết tới tệp đối tượng và thư viện do trình biên dịch MS tạo ra (mặc dù tôi không chắc là có đảm bảo rằng nó được hỗ trợ).

Một vấn đề liên quan là MinGW dựa chủ yếu vào thời gian chạy msvcrt.dll C do Microsoft cung cấp. Nhưng DLL đó không được phân phối bởi MinGW - nó là một phần của mọi hệ điều hành Windows, do đó MinGW dựa vào nó đơn giản là hiện diện như một cơ sở hệ điều hành cơ bản.