Tôi đang làm việc trên một thư viện C++ nhất định (hoặc nhiều khung công tác hơn). Tôi muốn làm cho nó trở về tương thích tương thích với các phiên bản trước, không chỉ duy trì khả năng tương thích API mà còn ABI (giống như công việc tuyệt vời của Qt).Tạo Thư viện với ABI tương thích ngược có sử dụng Boost
Tôi sử dụng rất nhiều chức năng của Boost và có vẻ như điều này làm cho khả năng tương thích ngược chỉ là không thể, trừ khi tôi buộc người dùng phải có phiên bản Boost (đôi khi cũ).
Có cách nào (không cần viết lại 1/2 của Boost) để tạo một số "tiền tố" xung quanh không gian tên/đổi tên nó để ngăn không cho nó can thiệp vào phiên bản Boost của người dùng không?
Ví dụ: libXYZ của tôi sử dụng Boost 1.33 và nó có lớp boost::foo
. Trong phiên bản 1.35 boost::foo
đã được nâng cấp và thành viên mới đã được thêm vào, do đó, boost::foo
từ 1.33 và 1.35 là không tương thích với ABI. Vì vậy, người dùng libXYZ phải sử dụng Boost 1.33 hoặc biên dịch lại libXYZ với Boost 1.35 (có thể đã bị hỏng một số API theo cách mà XYZ sẽ không biên dịch).
Lưu ý: Tôi đang nói về UNIX/Linux OS với ELF, nơi liên kết động tương tự như liên kết tĩnh, vì vậy bạn không thể liên kết với hai phiên bản thư viện khác nhau vì biểu tượng sẽ can thiệp.
Một giải pháp phù hợp mà tôi có thể nghĩ đến là đưa Boost vào một không gian tên riêng khác. Vì vậy, libXYZ sẽ sử dụng ::XYZ::boost::foo
thay vì ::boost::foo
. Điều này sẽ ngăn ngừa va chạm với phiên bản Boost khác mà người dùng có thể sử dụng.
Vì vậy, libXYZ sẽ tiếp tục làm việc với Boost 1.33 tĩnh hoặc động liên kết với nó withing namespace khác, giả định, rằng nó:
- Sẽ không vạch trần Boost API bên ngoài.
- Sẽ giữ phiên bản riêng tư ổn định của API được tiếp xúc.
Có cách nào để làm những việc như vậy với Boost không?
Chỉnh sửa: Cuối cùng, tôi quyết định tạo tập lệnh sẽ đổi tên tất cả biểu tượng tăng cường trong nguồn thành một số biểu tượng tùy chỉnh.
Lý do: đơn giản hóa quá trình xây dựng, độc lập với hỗ trợ khả năng hiển thị của trình biên dịch, tính năng hiển thị chỉ hoạt động trên thư viện động, vì điều này không hoạt động, vì vậy tôi cần xây dựng riêng biệt và phụ thuộc cho từng loại thư viện.
Các kịch bản có sẵn ở đó: http://art-blog.no-ip.info/files/rename.py
Chỉnh sửa 2: Phiên bản mới nhất của Boost BCP hỗ trợ namespace đổi tên.
Ý của bạn là gì bởi "liên kết động tương tự như liên kết tĩnh?" ELF SOs rất giống với các DLL trên Windows. Trong thực tế, các tệp DLL có lẽ giống như các định dạng tĩnh hơn so với các ELF SO (các tệp DLL không phải là vị trí độc lập như các ELF thường là). – Zifre