2017-02-01 20 views
6

Tôi muốn hỏi tính hữu dụng của tệp .lib được tạo trong khi biên soạn một dự án dll.Tính hữu ích của tệp .lib được tạo ra khi biên dịch các dự án dll, tôi có thể sử dụng nó cho liên kết tĩnh không?

Khi chúng tôi lập dự án của chúng tôi, các file sau đây được tạo: .dll .exp lib PDB

Bây giờ khi chúng ta cũng có file .lib, chúng ta có thể sử dụng tập tin này để tĩnh liên kết nó với bất kỳ dự án nào khác. Nếu không, thì việc sử dụng tệp .lib này sẽ được tạo ra như thế nào.

+0

Có thể bạn sẽ tìm thấy [câu hỏi này] (https://stackoverflow.com/questions/3573475/how-does-the-import-library-work-details) thông tin. – WhozCraig

+0

Hi Gray, câu hỏi được hỏi có tiêu đề hoàn toàn khác, bất kỳ ai cố gắng tìm câu trả lời cho câu hỏi tương tự mà tôi đã hỏi sẽ không tìm kiếm cách thư viện nhập hoạt động, bạn không được sao chép nó, ít nhất là vì lợi ích của người dùng khác tìm ra vấn đề tương tự –

Trả lời

4

.lib cho thư viện được chia sẻ không được sử dụng để liên kết tĩnh, nó được sử dụng để cung cấp cho mối liên kết ý tưởng về những gì được ẩn bên trong tệp .dll. Hãy suy nghĩ về nó như là tập tin tiêu đề mà bạn cung cấp cho các mối liên kết để đảm bảo rằng nó biết về tất cả các chức năng thuộc về .dll và bạn cần. Hãy tự hỏi mình một câu hỏi: làm cách nào bạn sử dụng tệp .dll được tạo mà không có .lib? LoadLibrary không đếm - nó có biến chứng (lớp phương pháp? Mangling?) Và tạo ra một sự không chắc chắn như với opencv_ffmpeg.dll: nó không thể tồn tại trong PATH, và opencv_video liên kết chương trình sẽ vẫn chạy, nhưng sẽ không cho chúng tôi biết bất cứ điều gì, cũng như nó sẽ không chơi video mà không có nó - không có thông báo lỗi rõ ràng. Ngoài ra, phương pháp này là nền tảng cụ thể.

. Thư viện tĩnh khác, chứa một tệp đối tượng chính thức, được đưa trực tiếp vào tệp thi hành.

Ý tưởng cơ bản - cho dù đó là thư viện tĩnh hay chia sẻ, bạn vẫn nên liên kết cả hai cách khá giống nhau - nhưng sau đó, nếu thư viện được chia sẻ, chương trình của bạn sẽ KHÔNG chạy mà không bao gồm .dll tương ứng vào phân phối .

+1

Trên thực tế, LoadLibrary là phương thức linh hoạt nhất - mọi thứ khác được xây dựng theo nó - khi bạn liên kết với một thư viện import, bạn sẽ ủy nhiệm LoadLibrary/GetProcAddress cho người lãnh đạo và yêu cầu trình biên dịch viết các cuộc gọi gián tiếp thông qua IAT thay cho các cuộc gọi hàm thẳng, nhưng đường ống cấp thấp là như nhau. –

+0

@MatteoItalia - Vâng, đã đồng ý. Mặt khác, lắp ráp là cách linh hoạt hơn về hiệu suất và tiềm năng. Tuy nhiên, ở đây chúng tôi đang mã hóa trên C + +. –

+0

@MatteoItalia Điều tôi muốn nói là mọi thứ đều được xây dựng, nhưng nếu có cách nào tốt hơn (vì nó phơi bày lỗi trong thời gian biên dịch trong trường hợp này, và không yêu cầu người lập trình biết tên đầy đủ chức năng bị nhiễm độc bằng xoài , trong đó bạn có thể làm một lỗi đánh máy và gỡ lỗi nó vĩnh cửu), tại sao lại sử dụng cái khó hơn? –

12

.lib được tạo cùng với .dll được gọi là "thư viện nhập" và cho phép bạn sử dụng các chức năng dll bao gồm tiêu đề của chúng như thể chúng được liên kết tĩnh trong tệp thực thi của bạn. Nó đảm bảo rằng, khi trình liên kết phải sửa các địa chỉ hàm dll được tham chiếu thành các tệp đối tượng, nó có thể tìm thấy chúng bên trong thư viện nhập. Các chức năng như vậy được tìm thấy trong thư viện import thực sự là phần tử lấy địa chỉ thực của hàm tương ứng trong dll đã tải từ bảng Import Address và nhảy thẳng đến nó (theo truyền thống, bây giờ có một số thông minh trong mối liên kết cho phép tránh điều này nhảy).

Thư viện nhập khẩu lần lượt chứa các chỉ dẫn đặc biệt cho trình liên kết hướng dẫn nó tạo các mục có liên quan vào bảng nhập của tệp thực thi, lần lượt được tải bởi trình tải (trình liên kết động) , theo thuật ngữ Unix). Điều này đảm bảo rằng, trước khi điểm vào của tệp thực thi của bạn được gọi, các dll được tham chiếu được nạp và IAT chứa các địa chỉ chính xác của các hàm được tham chiếu.

Lưu ý rằng tất cả điều này chủ yếu chỉ là công cụ tiện lợi để cho phép bạn gọi các chức năng dll như thể chúng được liên kết tĩnh vào tệp thi hành của bạn. Bạn không nghiêm chỉnh cần tệp .lib nếu bạn xử lý truy xuất địa chỉ tải/chức năng động một cách rõ ràng (bằng cách sử dụng LoadLibrary và GetProcAddress); nó thuận tiện hơn khi ủy thác tất cả các công cụ này cho trình liên kết và trình tải.

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