2010-02-11 38 views
6

Tôi cần ít làm rõ trong lĩnh vực này. Tôi cảm thấy rằng các điều khoản Static library & Dynamic Library không chính xác.Thư viện tĩnh & Thư viện động: Lẫn lộn

  • lib1.o + lib2.o + lib3.o -> "LinkerOutputFile" (thực thi hoặc thư viện).
  • Nếu "LinkerOutputFile" này chứa mã của tất cả các tệp lib1.o, lib2.o, lib3.o thì nó được cho biết rằng "LinkerOutputFile" được liên kết satically "LinkerOutputFile" (thực thi hoặc thư viện). (Hoặc)

  • Nếu "LinkerOutputFile" chỉ chứa tham chiếu & thông tin khác về để lib1.o, lib2.o, lib3.o mà không chứa mã các tập tin * .o lib. Sau đó, nó nói rằng "LinkerOutputFile" Tự động liên kết.

Làm cách nào để các tệp lib * .o trở thành thư viện tĩnh hoặc thư viện động? Chúng chỉ là các tệp thư viện. Hoặc là nó, "LinkerOutputFile" là một thư viện thay vì thực thi sau đó phụ thuộc vào việc nó được liên kết tĩnh hoặc liên kết động với tên gọi là thư viện tĩnh hoặc thư viện động hay không. Đúng hay sai?

Tôi biết tôi sai, bởi vì, tôi biết rằng

Trên hầu hết các nền tảng Unix-phong cách phần mở rộng là

  • .a cho các thư viện tĩnh (tài liệu lưu trữ) và
  • .so cho thư viện được chia sẻ.

Trên Windows:

  • .dll chỉ ra một thư viện chia sẻ
  • lib chỉ ra một thư viện tĩnh hoặc nhập khẩu.

Nhưng không thể tìm ra nơi tôi sai. Ngoài ra, vui lòng cho tôi biết cách Static library & Dynamic Library nội bộ khác nhau.

Ngoài ra, đây là đặc điểm kỹ thuật từ ABI:

Chương này mô tả các đối tượng định dạng file , được gọi là ELF (thực thi và Linking Format). Có ba loại đối tượng chính là .

Một tập tin định vị giữ mã và dữ liệu phù hợp để liên kết với đối tượng khác file để tạo ra một thực thi hoặc một chia sẻ tập tin đối tượng.

An tệp thi hành giữ chương trình thích hợp để thực thi; tệp chỉ định cách exec (BA_OS) tạo hình ảnh quá trình của một chương trình .

A tệp đối tượng được chia sẻ giữ mã và dữ liệu phù hợp để liên kết trong hai ngữ cảnh . Đầu tiên, trình soạn thảo liên kết [xem ld (BA_OS)] xử lý đối tượng được chia sẻ tệp với các tệp đối tượng khác có thể chia sẻ và chia sẻ để tạo một đối tượng khác tệp. Thứ hai, liên kết động kết hợp nó với tệp thi hành và các đối tượng được chia sẻ khác để tạo hình ảnh quá trình .

"tệp đối tượng được chia sẻ" là các từ khác để nói Thư viện động (có phần mở rộng * .so). Nhưng còn "Thư viện tĩnh" thì sao? Điều này thậm chí không đề cập đến nó.

Có sự khác biệt nào giữa "Relocatable" & "Thư viện tĩnh" & "Thư viện nhập" không? Hãy làm rõ tôi với cấu trúc bên trong.

+0

Lưu ý rằng các tệp '.o' cho liên kết tĩnh và động khác nhau (xem tham chiếu gcc cho tùy chọn' -static'). Câu trả lời cho câu hỏi của bạn là ở đây: http://stackoverflow.com/questions/1210787/relation-between-object-file-and-shared-object-file/1210857#1210857 –

+0

có thể trùng lặp của [Sự khác biệt giữa các thư viện tĩnh và chia sẻ ?] (http://stackoverflow.com/questions/2649334/difference-between-static-and-shared-libraries) –

Trả lời

0

Hãy nói rằng tôi có tôi App liên kết với StaticLib.lib, sau đó tất cả các mã từ cả tôi AppStaticLib.lib sẽ nằm trong cùng một thực thi. Điều này có nghĩa là StaticLib.h chứa chức năng triển khai thực hiện trong đó.

Bây giờ nếu tôi liên kết App với DynamicLib.lib, sau đó tôi App sẽ sử dụng chức năng thực hiện trong DynamicLib.dll đó có nghĩa là DynamicLib.lib constains tài liệu tham khảo, một cái gì đó như:

  • OpenWAV được tìm thấy tại offset 1 trong DynamicLib.dll
  • CloseWAV được tìm thấy tại offset 2 trong DynamicLib.dll vv

Tên động có nghĩa là nó có thể được nạp bởi bất kỳ ứng dụng, không thực sự bằng cách liên kết với DynamicLib.lib, nhưng gọi LoadLibrary() và nhập các chức năng xuất khẩu của các DLL bằng tay.

Giới thiệu về Relocatable, tại thời điểm này tôi không quen thuộc với từ đó.

Tôi đang nói như một lập trình viên Windows vì vậy tôi không thực sự đang diễn ra trên Linux, nhưng việc đánh giá từ tên SO (Shared Objects) giống như các DLL.

Hy vọng câu trả lời của tôi hữu ích!

10

.o tệp không phải là bất kỳ tệp thư viện nào. Chúng là một đối tượng đối tượng.

.a/.lib tệp được liên kết tại thời gian xây dựng. Họ không thể được thay thế sau khi thực tế. Điều này làm cho chúng tĩnh.

.so/.dll tệp được liên kết khi chạy. Chúng có thể được thay thế bất kỳ lúc nào trước khi bắt đầu thực hiện. Điều này làm cho chúng năng động.

Tái định cư dùng để chỉ vị trí nhị phân trong bộ nhớ; mã từ các thư viện tĩnh được tích hợp với hệ nhị phân và do đó không thể di chuyển độc lập.

4

Thư viện tĩnh chứa mã được sao chép vào tệp thực thi. Mã trong thư viện không được chương trình của bạn tham chiếu bị xóa. Một chương trình chỉ với các thư viện tĩnh không có bất kỳ sự phụ thuộc nào trong thời gian chạy.

Thư viện động được liên kết trong thời gian chạy - chương trình có tham chiếu đến thư viện động sẽ tải và liên kết với thư viện khi khởi động (hoặc theo yêu cầu).

Thư viện có thể định vị lại là một từ khác cho thư viện động. Khi bạn liên kết với một thư viện động, các địa chỉ của các hàm chứa bên trong được tính toán, dựa vào nơi thư viện được nạp vào bộ nhớ. Chúng có thể "relocatable" bởi vì các địa chỉ của các hàm được chứa không được xác định tại thời gian liên kết. (Trong một thư viện tĩnh, các địa chỉ được tính trong thời gian liên kết.)

Tệp đối tượng (.o) chứa mã được biên dịch, nhưng không chứa địa chỉ cuối cùng của tất cả các chức năng. Liên kết là quá trình mà trình liên kết đi qua tất cả các tệp đối tượng và tính toán địa chỉ chính xác cho mỗi hàm được gọi.

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