2012-06-15 34 views
10

Có những điều mà tôi không hiểu khi nói đến liên kết ... Tôi đang viết chương trình bằng thư viện của bên thứ 3 (thư viện GEOS). Chương trình này có một sự phụ thuộc vào geos.lib nhưng vẫn cần geos.dll để chạy.Chương trình được liên kết tĩnh với thư viện nhưng vẫn cần dll để chạy

Tôi đọc this question, tôi nghĩ rằng tôi hiểu sự khác biệt giữa các thư viện tĩnh và động. Những gì tôi không hiểu là lý do tại sao tôi vẫn cần một dll khi tôi tĩnh liên kết một thư viện.

Trả lời

16

Nó không được liên kết tĩnh. Các .lib chỉ là một thư viện sơ khai mà liên kết trong các .dll trên cửa sổ. Đó là, bạn liên kết với .lib tại thời gian biên dịch, và sau đó trong thời gian chạy nó sẽ đi tìm các .dll.

+0

Không có tùy chọn nào cho phép liên kết tĩnh mã từ tệp .dll cụ thể không? –

+1

Tôi nghĩ rằng bạn phải biên dịch thư viện để liên kết tĩnh, tôi không chắc chắn bạn có thể thay đổi một dll thành một thư viện liên kết tĩnh sau khi nó đã được biên dịch. –

+0

@Andrew Vì vậy, các tệp dll luôn đi kèm với một .lib? Làm cách nào để biết khi nào .lib không đủ và tôi cần cung cấp dll? – undu

0

Bạn chắc chắn liên kết với thư viện động. Chỉ vì trình liên kết yêu cầu tệp .lib không có nghĩa là bạn đang liên kết đến một thư viện tĩnh.

0

Bạn có thể liên kết tĩnh tệp lib nếu và chỉ khi đây là tệp lib tĩnh. Vì vậy, trước tiên bạn cần chuyển đổi dự án dll của bạn thành lib tĩnh, xây dựng nó và sau đó sử dụng sản phẩm của bản dựng của bạn sẽ là tệp .lib tĩnh.

18

Có 3 loại thư viện trên Windows:

thư viện đối tượng
  • (* .lib)
  • thư viện nhập khẩu (* .lib)
  • thư viện động (* .dll)

thư viện đối tượng được liên kết tĩnh. Chúng chứa các định nghĩa đối tượng đầy đủ của mã được trừu tượng hóa bởi thư viện.

thư viện nhập là một dạng đặc biệt của thư viện đối tượng. Thay vì chứa mã, chúng chứa thông tin cho trình liên kết mà cuối cùng ánh xạ tệp thực thi vào thư viện liên kết động.

thư viện liên kết động, như thư viện đối tượng, mã cung cấp cho chương trình của bạn. Tuy nhiên, mã này được tải vào thời gian chạy và không được biên dịch vào exe của bạn.

Bạn không cần phải liên kết thư viện nhập. Thay vào đó bạn có thể gọi LoadLibrary() và tra cứu các điểm vào API theo tên hoặc thứ tự. (Bạn luôn phải cho biết mã DLL nào và ở đâu trong API của DLL bạn muốn nhập.)

Các nhận xét khác ở đây là chính xác ở chỗ bạn không thể tạo DLL thành lib tĩnh mà không biên dịch lại mã cho thư viện - đó là một loại đầu ra khác.

+4

[Hướng dẫn cho người mới bắt đầu liên kết] (http://www.lurklurk.org/linkers /linkers.html) là một bài viết tuyệt vời về liên kết. Tôi đã tìm thấy nó trong tuần này trong khi nghiên cứu chính xác câu hỏi này. – Pressacco

1

Nếu .lib được tạo bởi Visual Studio, sau đó kiểm tra giá trị của thuộc tính Project -> Linker -> Input -> Module Definition File. Nếu nó không rỗng thì link.exe tạo thư viện sơ khai thay vì thư viện tĩnh ngay cả khi thuộc tính Project -> General -> Configuration Type là "Static library (.lib)".

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