Bên trong tệp .lib của Thư viện tĩnh, Thư viện động được liên kết tĩnh và Thư viện động được liên kết động là gì?


82

Bên trong tệp .lib của Thư viện tĩnh, Thư viện động được liên kết tĩnh và thư viện động được liên kết động là gì?

Tại sao không cần tệp .lib trong thư viện động được liên kết động và cả trong liên kết tĩnh, tệp .lib không là gì ngoài tệp .obj với tất cả các phương thức. Đúng không?


4
Có thể lưu ý rằng câu hỏi là về nền tảng MS Windows.
cubuspl42

Câu trả lời:


144

Đối với thư viện tĩnh, tệp .lib chứa tất cả mã và dữ liệu cho thư viện. Trình liên kết sau đó xác định các bit nó cần và đưa chúng vào tệp thực thi cuối cùng.

Đối với thư viện động, tệp .lib chứa danh sách các hàm và phần tử dữ liệu đã xuất từ ​​thư viện và thông tin về DLL mà chúng đến từ. Khi trình liên kết xây dựng tệp thực thi cuối cùng thì nếu bất kỳ chức năng hoặc phần tử dữ liệu nào từ thư viện được sử dụng thì trình liên kết sẽ thêm một tham chiếu đến DLL (khiến nó được Windows tự động tải) và thêm các mục vào bảng nhập của tệp thực thi để rằng một lệnh gọi đến hàm được chuyển hướng đến DLL đó.

Bạn không cần tệp .lib để sử dụng thư viện động, nhưng nếu không có tệp này, bạn không thể coi các hàm từ DLL là các hàm bình thường trong mã của mình. Thay vào đó, bạn phải gọi theo cách thủ công LoadLibraryđể tải DLL (và FreeLibrarykhi bạn đã hoàn tất) và GetProcAddressđể lấy địa chỉ của hàm hoặc mục dữ liệu trong DLL. Sau đó, bạn phải truyền địa chỉ được trả về tới một con trỏ đến hàm thích hợp để sử dụng nó.


4
Sau một thời gian dài tìm kiếm IMO, tôi đã có câu trả lời tốt nhất cho lý do sử dụng lib & dll. Cảm ơn
Jeet

@Anthony Williams khi bạn nói, "Đối với thư viện động, tệp .lib chứa danh sách các hàm và phần tử dữ liệu đã xuất từ ​​thư viện và thông tin về tệp DLL mà chúng đến từ.", Đó có phải là tệp .lib được gọi là "nhập không thư viện "khác với tệp .lib bình thường (" thư viện tĩnh ")?
starriet

Có, đó là một thư viện nhập
Anthony Williams

13

Tôi thấy câu trả lời sau của Hans cũng hữu ích ở đây. Nó làm rõ ràng rằng có thể có hai loại tệp lib.

Tệp LIB được sử dụng để xây dựng chương trình của bạn, nó chỉ tồn tại trên máy xây dựng của bạn và bạn không gửi nó. Có hai loại. Thư viện liên kết tĩnh là một túi các tệp .obj, được thu thập thành một tệp duy nhất. Trình liên kết chọn bất kỳ đoạn mã nào từ tệp khi cần phân giải mã nhận dạng bên ngoài.

Nhưng phù hợp hơn với DLL, một tệp LIB cũng có thể là một thư viện nhập. Sau đó, nó là một tệp nhỏ đơn giản bao gồm tên của DLL và danh sách tất cả các chức năng được DLL xuất ra. Bạn sẽ cần cung cấp nó cho trình liên kết khi bạn xây dựng một chương trình sử dụng DLL để nó biết rằng số nhận dạng bên ngoài thực sự là một hàm được DLL xuất ra. Trình liên kết sử dụng thư viện nhập để thêm các mục nhập vào bảng nhập cho EXE. Sau đó, lần lượt được Windows sử dụng trong thời gian chạy để tìm ra những tệp DLL cần được tải để chạy chương trình.


8

Trong thư viện tĩnh, tệp lib chứa mã đối tượng thực cho các chức năng do thư viện cung cấp. Trong phiên bản chia sẻ (cái mà bạn gọi là thư viện động được liên kết tĩnh), chỉ có đủ mã để thiết lập liên kết động trong thời gian chạy.

Tôi không chắc về "thư viện động được liên kết động" (được tải theo chương trình). Bạn thậm chí có liên kết với .lib trong trường hợp đó không?

Biên tập:

Có hơi muộn khi xuất hiện, nhưng không, bạn không liên kết .lib. Vâng, bạn liên kết đến lib với thư viện tải lên trong đó. Nhưng đối với thư viện thực tế bạn đang sử dụng, bạn cung cấp các liên kết của riêng mình thông qua con trỏ hàm C và tải thư viện điền vào các liên kết đó.

Đây là một bản tóm tắt:

Liên kết ǁ Tĩnh | DLL | LoadLibrary
========= ǁ =============== | ========================= | ==================
Mã API ǁ Trong com- | Trong DLL | Trong DLL
cuộc sống ǁ chương trình chất đống | |
--------- ǁ --------------- | ---------------------- | - ------------------
Chức năng ǁ Trực tiếp, có thể | Gián tiếp qua bảng | Gián tiếp qua của bạn
cuộc gọi ǁ được giải thích | điền tự động | ptrs chức năng riêng
--------- ǁ --------------- | ---------------------- | - ------------------
Burden ǁ Trình biên dịch | Trình biên dịch / Hệ điều hành | Bạn / OS

bởi các thư viện được liên kết tĩnh, ý tôi là sử dụng tệp .lib và liên kết .dll tại thời điểm biên dịch. Liên kết động đang liên kết .dll trong thời gian chạy bằng cách sử dụng hàm libraryloaderex () của Win32 API.
Sulla

6

Trình liên kết đọc tệp lib và tệp dll được sử dụng trong quá trình thực thi. Tệp lib về cơ bản là vô dụng trong quá trình thực thi và trình liên kết không có khả năng đọc tệp dll (ngoại trừ có thể theo cách không liên quan ở đây).

Sự khác biệt giữa việc sử dụng tệp lib cho liên kết tĩnh và động có thể gây nhầm lẫn nhưng nếu bạn hiểu một chút lịch sử thì sẽ thấy rất rõ ràng.

Ban đầu chỉ có các thư viện tĩnh. Đối với thư viện tĩnh, tệp .lib chứa các tệp obj. Mỗi tệp obj là đầu ra của một và chỉ một tệp đầu vào mã nguồn của trình biên dịch. Tệp lib chỉ là một tập hợp các tệp obj có liên quan, giống như việc đặt các tệp obj vào một thư mục. Về cơ bản đó là tệp lib, một thư viện các tệp obj. Đối với liên kết tĩnh, tất cả các tệp obj mà tệp thực thi sử dụng được kết hợp thành một tệp. So sánh liên kết đó với liên kết động trong đó tệp thực thi nằm trong tệp tách biệt với mã khác mà tệp sử dụng.

Để triển khai liên kết động, Microsoft đã sửa đổi việc sử dụng các tệp lib để chúng tham chiếu đến tệp dll thay vì các vị trí trong tệp obj. Ngoài ra, tất cả thông tin có trong thư viện cho một liên kết tĩnh cũng giống như cho một liên kết động. Tất cả chúng đều giống nhau về mặt thông tin trong đó ngoại trừ một tệp lib cho một liên kết động chỉ định tệp dll.


1

Trong dll là "những thứ" như trong exe (có thể có bất kỳ loại dữ liệu nào, nhập, xuất, đọc / ghi / phần thực thi) nhưng sự khác biệt là tệp exe chỉ xuất điểm nhập (chức năng) nhưng dll xuất một / nhiều chức năng.

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.