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.
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. –
@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