2011-09-22 47 views
5

Tôi đã làm việc với SFML, tôi đã biên soạn một chương trình thử nghiệm nhỏ và thêm tùy chọn liên kết -lsfml-audio. Sau đó, tôi đã sử dụng ldd ./program để xem các thư viện động mà nó đang liên kết đến. Đáng ngạc nhiên, có rất nhiều, không ai trong số họ đã tự tôi chọn trong makefile của tôi, cũng không sử dụng pkg-config --libs.Liên kết các phụ thuộc của một thư viện được chia sẻ

Tôi bắt đầu đọc về các thư viện được chia sẻ và tạo một ví dụ nhỏ để giải quyết các nghi ngờ của mình. Tuy nhiên, tôi có câu hỏi này:

lý do tại sao một số thư viện cần bạn thêm các phụ thuộc trong makefile của bạn (hoặc bằng tay hoặc sử dụng một kịch bản như pkg-config) và các thư viện khác tự động liên kết phụ thuộc của họ?

Khi bạn đang tạo thư viện động của bạn, chỉ là dễ dàng như việc thêm -ldependency tùy chọn thích hợp trong lệnh g++ -shared ... để tránh cho người dùng những rắc rối của tay thêm phụ thuộc sau này. Tại sao nhiều thư viện có sẵn không làm điều đó?

Tôi đoán nó phải liên quan đến khả năng tinh chỉnh thư viện nào được liên kết và như vậy.

Trả lời

6

Thư viện được chia sẻ thường sẽ liên kết trong các phụ thuộc của chúng. Tuy nhiên, các thư viện tĩnh không có khả năng làm như vậy. pkg-config --libs thường bao gồm tất cả các phụ thuộc (trực tiếp và gián tiếp) để bạn có thể chuyển sang trình biên dịch tĩnh bằng cách thêm -static mà không cần thêm phụ thuộc thư viện bổ sung. Lưu ý rằng những phụ thuộc trực tiếp dư thừa này được coi là không mong muốn trong một số trường hợp (ví dụ: debian cố gắng tránh chúng trong các tệp nhị phân đóng gói, vì chúng làm cho quá trình chuyển đổi thư viện trở nên đau buồn hơn mức cần thiết). Bạn có thể hướng dẫn trình liên kết loại bỏ các phụ thuộc trực tiếp từ tệp thực thi cuối cùng không cần thiết với cờ -Wl,--as-needed.

+0

Tôi nghĩ rằng tôi cần phải thực hiện một số cuộc gọi tên ở đây: Thư viện được chia sẻ thường không kéo phụ thuộc của chúng (đó là 'libtool' khi nó thấy tệp' * .la'). Chúng không cần phải bao gồm nó vì trình nạp động sẽ tìm ra chúng từ tiêu đề '.NEEDED' trong các thư viện được chia sẻ. Ngoài các vấn đề overlinking 'libtool' giới thiệu, phải tìm các định nghĩa biểu tượng tại thời gian liên kết cũng có thể làm chậm quá trình xây dựng rất nhiều. –

+0

@honk, Có, libtool là một trong những vấn đề này. Tuy nhiên, các script pkg-config cũng có thể làm điều đó. Trong bất kỳ trường hợp nào, chúng chắc chắn không cần thiết trên các nền tảng ELF - bạn chỉ cần liên kết những gì bạn sử dụng trực tiếp (mặc dù điều này bao gồm mọi thứ được sử dụng thông qua các hàm nội tuyến hoặc macro) – bdonlan

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