2010-07-14 78 views
58

Có gì 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?Có gì 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àm thế nào để không cần tệp .lib trong thư viện động được liên kết động và cũng 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?

+2

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

Trả lời

89

Đố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. Sau đó, trình liên kết sẽ xác định các bit cần thiết và đặt chúng trong 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à thành phần dữ liệu được xuất từ ​​thư viện và thông tin về chúng xuất phát từ tệp DLL nào. Khi trình liên kết xây dựng bản thực thi cuối cùng thì nếu có bất kỳ hàm 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 tham chiếu đến DLL (khiến nó được Windows tải tự động) và thêm các mục vào bảng nhập của tệp thực thi rằng một cuộc gọi đến hàm được chuyển hướng vào DLL đó.

Bạn không cần tệp .lib để sử dụng thư viện động, nhưng không có bạn không thể xử lý các hàm từ tệp DLL làm hàm bình thường trong mã của bạn. Thay vào đó, bạn phải gọi thủ công LoadLibrary để tải DLL (và FreeLibrary khi 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ỉ trả về tới một hàm con trỏ thích hợp để sử dụng nó.

+1

Sau một tìm kiếm dài, IMO, tôi nhận được câu trả lời hay nhất vì lý do sử dụng lib & dll. Cảm ơn – Jeet

6

Trong thư viện tĩnh, tệp lib chứa mã đối tượng thực tế cho các chức năng do thư viện cung cấp. Trong phiên bản được chia sẻ (những gì 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 khi chạy.

Tôi không chắc chắn 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 một .lib trong trường hợp đó?

Edit:

Một chút muộn tới, nhưng không có, bạn không liên kết một lib. Vâng, bạn liên kết với lib với libraryloaderex trong đó. Nhưng đối với các thư viện thực tế mà bạn đang sử dụng, bạn cung cấp cam kết ràng buộc của mình thông qua con trỏ hàm C và LoadLibrary lấp đầy những người trong

Dưới đây là một bản tóm tắt:.

 
Linking ǁ Static  | DLL     | LoadLibrary 
=========ǁ===============|======================|=================== 
API code ǁ In your com- | In the DLL   | In the DLL 
lives ǁ piled program |      | 
---------ǁ---------------|----------------------|------------------- 
Function ǁ Direct, may | Indirect via table | Indirect via your 
calls ǁ be elided  | filled automatically | own function ptrs 
---------ǁ---------------|----------------------|------------------- 
Burden ǁ Compiler  | Compiler/OS   | You/OS 
+0

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

1

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

8

Tôi tìm thấy sau đây answer từ Hans cũng hữu ích ở đây.Nó xóa không khí có thể có hai loại tệp lib.

Tệp LIB được sử dụng để tạo 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. Có hai loại. Một liên kết tĩnh thư viện 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ải giải quyết số nhận dạng bên ngoài.

Nhưng có liên quan hơn đến tệp DLL, tệp LIB cũng có thể là thư viện nhập. Sau đó, nó là một tệp nhỏ đơn giản bao gồm tên của tệp DLL và danh sách của tất cả các hàm được xuất bởi tệp DLL. Bạn sẽ cần phải 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 một số nhận dạng bên ngoài thực sự là một hàm được xuất bởi DLL. 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 khẩu cho EXE. Mà sau đó lần lượt được sử dụng bởi Windows tại thời gian chạy để tìm ra những gì DLL cần phải được nạp để chạy chương trình.

1

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

Sự khác biệt giữa việc sử dụng các 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ì nó trở nên rất rõ ràng.

Ban đầu chỉ có các thư viện tĩnh. Đối với một 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 trình biên dịch. Một 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 trong một thư mục. Đó là cơ bản những gì một tập tin lib là, một thư viện của các tập tin obj. Đối với một liên kết tĩnh, tất cả các tệp obj mà việc sử dụng thực thi được kết hợp thành một tệp. So sánh điều đó với một liên kết động trong đó tệp thực thi nằm trong một tệp riêng biệt với mã khác mà nó sử dụng.

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

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