2011-12-22 34 views
11

Tôi nhận thấy có lỗi với các ứng dụng tùy thuộc vào thư viện được chia sẻ: nếu bạn thiếu một số phụ thuộc, ứng dụng sẽ không thành công tại thời điểm tải ngay cả khi người dùng không có ý định sử dụng chức năng của phụ thuộc.Các thư viện được chia sẻ tùy chọn

Tôi muốn ứng dụng của mình tốt hơn thế. Lý tưởng nhất, thay vì phân phối nhiều như n gói khác nhau, trong đó n = numberOfSupportedArchitectures * numberOfSupportedOS * ∏ (đối với mỗi thư viện được chia sẻ) (số lượng thay thế) Tôi sẽ gặp lỗi "khi tải thư viện được chia sẻ" tại thời điểm tải khi thư viện tôi muốn - nhưng không cần - được tìm thấy là vắng mặt, sau đó tiếp tục thực hiện theo cách đơn giản tránh sử dụng các liên kết chưa được giải quyết có liên quan. Nhưng rõ ràng không có ngoại lệ ai có thể bắt được. Nếu một cái gì đó bị mất, tất cả sẽ rơi xuống trước khi main() thậm chí bắt đầu.

Gần nhất tôi có thể có được quyền kiểm soát quá trình tải là giải quyết tất cả các liên kết bản thân mình với dlopen, dlsym và như vậy. Thật mệt mỏi. Tôi mong đợi đã có một thư viện có sẵn để làm điều đó cho tôi?

Tôi lưu ý rằng đây không phải là vấn đề trên bản phân phối nguồn hoặc trên cửa sổ. Tôi sẽ đặt các gói nhị phân trong các thẻ nhưng dường như tôi không có thẻ đại diện cho các thẻ đồng xu.

'có vẻ như giải pháp thanh lịch nhất sẽ nằm trong việc tinh chỉnh hành vi của trình tải/liên kết của hệ điều hành.

Trả lời

0

Bạn có thể tự mình bao gồm các thư viện được chia sẻ và điều chỉnh đường dẫn tìm kiếm liên kết qua -rpath $ORIGIN.

+0

Hoặc chạy chương trình thông qua tập lệnh đặt biến môi trường 'LD_LIBRARY_PATH'. – rodrigo

+0

Các lựa chọn thay thế để tải thư viện không chỉ là các phiên bản khác nhau của chúng, chúng sẽ có các giao diện hoàn toàn khác nhau, hoặc chúng sẽ vắng mặt hoàn toàn và chức năng mà chúng cung cấp sẽ không hiển thị trong UX. Mặc dù điều này có thể cung cấp một đại lộ để xử lý các thư viện vắng mặt; Tôi có thể tạo các thư viện shill trơ với cùng giao diện như các mục tiêu bị thiếu, ở đâu, nếu các mục tiêu bị thiếu, chúng có thể đáp ứng nhu cầu của liên kết để liên kết với một cái gì đó. Có vẻ ngớ ngẩn mặc dù. – mako

2

Bạn có thể xem weak symbols. Tuy nhiên, đây không phải là một phần của tiêu chuẩn C hoặc C++ - do đó một chút phụ thuộc vào trình biên dịch. Nhưng nếu bạn đang đi cho GCC, nó sẽ làm việc cho bạn, tôi đoán.

+0

Điều này không đòi hỏi tôi phải xác định các cơ quan trơ cho mọi biểu tượng trong các tiêu đề của thư viện? – mako

+1

Không thực sự. Bạn có thể kiểm tra sự tồn tại của biểu tượng. Nếu bạn có 'void foo();' bạn có thể gọi chúng theo cách sau: 'if (foo) foo(); ' – Krizz

+0

Ah. Nhưng tôi sẽ phải tuyên bố tất cả chúng như những biểu tượng yếu? – mako

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