2010-03-08 32 views
7

Giả sử bạn có 2 thư viện chia sẻ, lib1.so và lib2.so, cả hai đều có libcommon.a được liên kết tĩnh vào chúng. Trình biên dịch có phàn nàn về tham chiếu biểu tượng mơ hồ nếu bạn liên kết động cả lib1.so và lib2.so? Hoặc sẽ là trình biên dịch đủ thông minh để biết các ký hiệu libcommon được chia sẻ giữa lib1 và lib2 và cho phép bạn liên kết động với cả hai?Liên kết với nhiều thư viện được chia sẻ mà tất cả liên kết với một thư viện tĩnh phổ biến

Trả lời

2

Thư viện tĩnh sẽ được sử dụng để giải quyết các liên kết nội bộ nhưng liên kết bên ngoài sẽ không được truyền đến giao diện thư viện được chia sẻ, do đó sẽ không có xung đột. Mỗi thư viện được chia sẻ sẽ bao gồm bản sao mã thư viện tĩnh của riêng nó.

+4

Ít nhất là dưới GNU/Linux, Nếu tôi tạo thư viện chia sẻ (.so) liên kết đến một thư viện tĩnh (.a), tôi có thể truy cập bất kỳ ký hiệu nào được lấy từ thư viện tĩnh từ tệp thực thi vào thư viện được chia sẻ (.so), vì vậy tôi khá chắc chắn rằng các ký hiệu từ thư viện tĩnh _are_ được truyền đến giao diện của thư viện được chia sẻ. Có lẽ mọi thứ hoạt động khác nhau trên một số hệ thống khác, nhưng hầu hết các hệ thống tôi đã làm việc trên đây là trường hợp với các tùy chọn trình liên kết mặc định. –

+0

@Jay Walker: Đối với những gì nó có giá trị, tôi thích câu trả lời của bạn. Bất kể cơ chế nào, sự thật cơ bản là không có xung đột nào xảy ra. – Clifford

3

Sẽ không có xung đột vì khi bạn liên kết tới thư viện được chia sẻ, trình liên kết sẽ sử dụng định nghĩa từ thư viện được chia sẻ đầu tiên cung cấp biểu tượng và không nhìn xa hơn vào các thư viện được chia sẻ khác. Các ký hiệu bao gồm từ .a sẽ được xuất khẩu trong cả hai thư viện được chia sẻ nhưng sẽ không xung đột.

+0

Điều này không đúng. Có những biểu tượng xuất khẩu yếu và mạnh mẽ. Nếu có sự khác biệt giữa mạnh thì có lỗi. – Trismegistos

0

Giả sử hai thư viện được chia sẻ được liên kết với các thư viện tĩnh khác nhau. Nhưng các thư viện tĩnh đều chứa một hàm có cùng tên. Sẽ có xung đột.

Tôi chắc chắn rằng vì tôi có một ứng dụng tcl/tk, nó tải hai thư viện tcl (.so). Cả hai thư viện đều được liên kết tĩnh với thư viện openssl. nhưng với phiên bản khác. Lỗi phân đoạn xảy ra khi tôi chạy ứng dụng tcl. Tôi theo dõi nó vào openssl. Có một thay đổi chức năng được thực hiện trong phiên bản mới.

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