2013-05-01 33 views
7

Tôi hiểu rằng mã được bao gồm trong tệp thực thi tại thời gian biên dịch có thể đến từ tệp đối tượng (tệp .o) và thư viện được liên kết tĩnh (tệp .lib/.a). Về cơ bản và khái niệm sự khác biệt giữa hai điều này là gì? Tại sao có một khái niệm khác nhau giữa "mã đối tượng" và "thư viện liên kết tĩnh"? Những ưu điểm và nhược điểm của mỗi loại là gì, và tại sao lại sử dụng cái này như trái ngược với cái kia? Thư viện liên kết tĩnh có thể được tạo từ các tệp đối tượng và ngược lại, có thể đối tượng (các) tệp được tạo từ thư viện được liên kết tĩnh không?C/C++: Sự khác biệt giữa thư viện liên kết tĩnh và tệp đối tượng là gì?

Trả lời

6

Thư viện đơn giản là một tệp chứa nhiều tệp đối tượng, có thể tìm kiếm để giải quyết các ký hiệu.

Vì vậy, thông thường, khi bạn liên kết các đối tượng với nhau, bạn sẽ có được tất cả các đối tượng trong một tệp thực thi (mặc dù một số trình liên kết tối ưu hóa có thể loại bỏ các đối tượng không sử dụng).

Khi bạn đưa thư viện cho trình liên kết, nó sẽ kiểm tra từng tệp đối tượng trong đó và mang đến những tệp cần thiết để đáp ứng các ký hiệu chưa được giải quyết (và có thể tiếp tục đưa chúng vào cho đến khi tất cả biểu tượng được giải quyết hoặc không nhiều hơn có thể).

Nó chỉ là một cách đóng gói hiệu quả nhiều đối tượng vào một tệp để người liên kết có thể thực hiện nhiều công việc của bạn hơn - bạn không cần phải lo lắng về các đối tượng cần .

Nếu bạn nghĩ đến thư viện C, bạn có thể có printf.o, puts.o, fopen.o do việc giữ nguồn của bạn được tách biệt tốt. Bạn không muốn người dùng phải liệt kê rõ ràng tất cả các tệp đối tượng mà họ muốn để bạn đóng gói toàn bộ lô hàng thành libc.a và nói với họ rằng họ chỉ cần liên kết với tệp đơn đó.


Bit tĩnh liên kết là không thích hợp ở đây, nó chỉ quyết định rằng các đối tượng nên đi vào thực thi vào thời điểm liên kết chứ không phải bị động nạp tại thời gian chạy. Nó được giải thích here.

+1

Vậy tại sao có sự khác biệt về hiệu quả hoặc số lượng công việc mà người dùng phải làm khi sử dụng tệp thư viện thay vì một hoặc nhiều tệp đối tượng? Không thể người liên kết luôn tối ưu hóa? Và nếu các thư viện liên kết tĩnh là một tập hợp các tệp đối tượng, thì nó có tải từng tệp con của đối tượng tất cả hoặc không, hoặc chỉ lấy các biểu tượng được sử dụng? Bạn có một ví dụ về sự khác biệt về vật liệu sẽ xảy ra bằng cách tạo một tệp thực thi từ cùng một mã dựa trên việc mã đó đến từ một thư viện được liên kết tĩnh so với (các) tệp đối tượng không? – user553702

+1

@ user553702, bạn có muốn liệt kê tám mươi lăm tệp đối tượng khác nhau không, một số thậm chí không cần thiết, hoặc bạn chỉ muốn liệt kê 'libc.a' và để cho trình liên kết làm việc? Có lẽ tôi vốn đã lười biếng nhưng đó không phải luôn luôn là một điều _bad_ :-) Như cách thức hoạt động của trình liên kết, nó _could_ vứt bỏ những thứ không thỏa mãn các biểu tượng ngay cả khi bạn liệt kê chúng một cách rõ ràng. Hầu hết không mặc dù ISTR Visual Studio là thông minh như thế. – paxdiablo

+0

Hầu hết người liên kết sẽ chỉ trích xuất các tệp đối tượng mà họ cần từ thư viện (và _all_ của từng tệp đối tượng mà họ quyết định họ cần) để đơn giản. – paxdiablo

9

Tệp đối tượng được biên dịch nhưng chưa được liên kết mã. Thư viện chứa các tệp đối tượng. Vì vậy, câu hỏi của bạn trở thành, "Tại sao sử dụng libs liên kết tĩnh nếu tôi chỉ có thể sử dụng các tệp đối tượng?" Đây là lý do tại sao.

Không giống như một bộ sưu tập của các đối tượng, mỗi trong số đó có các bảng biểu tượng của riêng mình, một thư viện có một duy nhất, thống nhất bảng biểu tượng, tạo ra khi ar được gọi bởi các nhà phát triển thư viện sử dụng s switch. s gọi ranlib để tạo bảng biểu tượng thống nhất cho tất cả các đối tượng trong lưu trữ đó.

Chạy ranlib trong vỏ cho thấy trong dòng đầu tiên của văn bản trợ giúp:

Tạo một chỉ số để tăng tốc độ truy cập vào tài liệu lưu trữ.

Và từ generic ranlib docs:

Một kho lưu trữ với một chỉ số như tăng tốc độ kết nối đến thư viện và cho phép thói quen trong thư viện để gọi nhau mà không quan tâm đến vị trí của họ trong kho lưu trữ .T

Xem thêm FreeBSD ranlib docs - từ ngữ khác nhau, ý tưởng tương tự: Tốc độ liên kết.

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