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
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.
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.
- 1. Sự khác biệt giữa tệp đối tượng .o và tệp thư viện .so là gì?
- 2. Sự khác nhau giữa thư viện tĩnh và tệp đối tượng có thể định vị lại?
- 3. Sự khác biệt giữa Điểm kết nối NTFS và Liên kết tượng trưng là gì?
- 4. Sự khác biệt giữa hậu tố tệp .cc và .cpp là gì?
- 5. Sự khác biệt giữa liên kết lại libeay32MD.lib và libeay32MT.lib là gì?
- 6. Sự khác biệt giữa tệp .so và .lo là gì?
- 7. sự khác nhau giữa plugin và thư viện là gì?
- 8. Sự khác biệt giữa thư viện và thư viện gốc
- 9. Sự khác biệt giữa đối tượng và *?
- 10. Sự khác biệt giữa các tệp tĩnh và tệp phương tiện trong Django là gì?
- 11. Sự khác biệt giữa đối tượng hàm và đối tượng có thể gọi là gì?
- 12. Sự khác biệt giữa đối tượng khẳng định là gì = null và Assert.assertNotNull (đối tượng)?
- 13. Sự khác nhau giữa mảng và đối tượng là gì?
- 14. Sự khác biệt giữa thư viện và mã ứng dụng?
- 15. Sự khác biệt giữa tệp * .bat và * .cmd là gì?
- 16. Sự khác nhau giữa thư viện chuẩn và thư viện mẫu chuẩn là gì?
- 17. 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?
- 18. Sự khác nhau giữa CC, gcc và g ++?
- 19. Sự khác biệt chức năng giữa một cá thể và một đối tượng là gì?
- 20. Sự khác biệt giữa trình liên kết động và trình tải động là gì?
- 21. Liên kết thư viện được chia sẻ với thư viện tĩnh: thư viện tĩnh có được biên dịch khác với một ứng dụng đang liên kết nó không?
- 22. Liên kết tĩnh các thư viện SDL2
- 23. Sự khác biệt giữa thư viện tĩnh và động trong Xcode cho iPhone
- 24. Sự khác biệt giữa các thư viện tĩnh và chia sẻ trong NDK của Android?
- 25. Liên kết các thư viện tĩnh, chia sẻ một thư viện tĩnh khác
- 26. Sự khác biệt giữa `đối tượng mới()` và `mới {}` trong C# là gì?
- 27. Sự khác biệt giữa đối tượng con trỏ và đối tượng kết nối
- 28. sự khác biệt giữa -lgcc_s và gcc
- 29. Sự khác biệt giữa Raphael và gRaphael là gì?
- 30. Sự khác biệt giữa gói android.opengl và javax.microedition.khronos.opengles là gì?
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
@ 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
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