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.
+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