2011-10-20 43 views
11

Giả sử tôi có libA. Nó phụ thuộc vào ví dụ libSomething cho thực tế đơn giản rằng một phương thức không nội tuyến của libA thực hiện cuộc gọi đến một phương thức trong libSomething.h. Sự phụ thuộc liên kết như thế nào trong trường hợp này? Liệu libA có phải liên kết tĩnh với libSomething khi nó được biên dịch hay người dùng libA (một ứng dụng sử dụng libA) có cần liên kết tới cả libA và libSomething không?Các thư viện tĩnh liên kết với các phụ thuộc như thế nào?

Cảm ơn

Trả lời

14

Liên kết tĩnh chỉ sao chép toàn bộ các mục (hàm, hằng số, v.v.) vào kết quả thực thi. Nếu một mã của thư viện tĩnh chứa các tham chiếu đến một số mục thư viện được chia sẻ, các tham chiếu này sẽ trở thành các phụ thuộc trong kết quả thực thi. Điều tương tự cũng xảy ra nếu bạn liên kết một thư viện thay vì thực thi.

This thread thảo luận về cách diễn ra trong Linux.

+0

Nếu tôi không muốn kết quả thực thi có gánh nặng thì tôi có thể làm gì? – jmasterx

+1

@Milo: bạn có thể liên kết các thư viện tĩnh của các phụ thuộc của libSomthing vào libA. –

+0

@Milo: nghĩa là bạn không muốn phụ thuộc chia sẻ? Sau đó, bạn chỉ cần liên kết mọi thứ tĩnh, chỉ sử dụng các thư viện tĩnh. Điều này sẽ dẫn đến một tập tin thực thi độc lập lớn không phụ thuộc. Nhưng được cảnh báo, rất khó để xây dựng một số thư viện như thư viện tĩnh. – vines

4

Trong quá trình xây dựng trình biên dịch dịch mã sang định dạng tạm thời, hãy gọi nó là tệp đối tượng. Trong tệp đối tượng, có một danh sách các ký hiệu mà trình biên dịch không thể giải quyết, thường là các định nghĩa ở nơi khác. Giai đoạn liên kết chịu trách nhiệm giải quyết các biểu tượng này.

Quy trình xây dựng sẽ cung cấp tệp cho trình liên kết cho đến khi tất cả các ký hiệu được giải quyết. Không có danh sách phụ thuộc vật lý, chỉ danh sách các biểu tượng để giải quyết. Điều này cho phép các ký hiệu được giải quyết bằng cách sử dụng các thư viện khác nhau. Ví dụ, người ta có thể muốn sử dụng một thư viện Windows cho các vấn đề cụ thể của Windows; một thư viện linux cho các vấn đề cụ thể của Linux. Điều này không nói rõ rằng một chương trình phụ thuộc vào thư viện Windows; nó cũng có thể phụ thuộc vào Linux.

Một số trình biên dịch có thể tạo danh sách phụ thuộc, thường là để sử dụng trong quá trình xây dựng. Tuy nhiên, trách nhiệm cuối cùng là lập trình viên.

6

Thư viện tĩnh là kho lưu trữ đơn giản của các tệp đối tượng nhị phân chưa được liên kết (* .o hoặc * .obj), khi biên dịch lưu trữ, không kiểm tra được thực hiện cho các phụ thuộc. Khi một liên kết thực thi nhị phân của một người (hoặc thư viện được chia sẻ/DLL), trình liên kết sẽ kiểm tra tất cả các phụ thuộc cần thiết và chỉ sau đó sẽ cảnh báo bạn về bất kỳ vấn đề nào.

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