Đây là tình huống, tôi có một codebase C++ đang sử dụng GCC (4.3.3) gần đây, nhưng tôi cần liên kết với thư viện cũ được xây dựng bằng GCC 3.2. 3. Không có phiên bản mới hơn của thư viện có sẵn, tôi không thể đi mà không có nó, và nó là nguồn đóng nên không thể xây dựng lại.Trộn C++ ABIs để xây dựng chống lại các thư viện cũ
Điều này dường như đặt ra một vấn đề vì có sự không tương thích ABI giữa GCC 4.3.3 và 3.2.3, vì vậy tôi đang cố gắng xem tùy chọn của tôi là gì để giải quyết vấn đề này.
Một vài chi tiết bổ sung:
- tôi có thể xây dựng lại tất cả mọi thứ trong codebase của tôi với -fabi-version = 1 để có được phiên bản ABI đúng, nhưng tôi phụ thuộc vào một số tính năng mới hơn từ libstdC++ phiên bản 6.
- Tất cả các phụ thuộc thư viện C++ bên ngoài codebase là mã nguồn mở, vì vậy tôi có thể xây dựng lại chúng khi cần thiết, ngoại trừ thư viện này.
- Nhiều phụ thuộc thư viện C không thể được xây dựng lại hoặc sẽ khó xây dựng lại.
- Thư viện cũ có vẻ là phụ thuộc vào một số libstdC++ phiên bản 5 tính năng
Tôi đã cho đến nay đã thử:
- Rebuild tất cả các mã và phụ thuộc thư viện C++ với -fabi-version = 1 và liên kết chống lại libstdC++ phiên bản 6. Điều này không thành công với một số ít các dấu hiệu biểu tượng không xác định cho các ký hiệu thư viện chuẩn C++.
- Tương tự như trên nhưng thêm liên kết trong thư viện được chia sẻ cho libstdC++ 5, điều này giải quyết vấn đề liên kết nhưng dường như dẫn đến việc trộn hai phiên bản vào thời gian chạy bên trong thư viện cũ và gây ra sự cố.
Tôi đọc trang này: http://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html có vẻ như có thể trộn các phiên bản C++ ABI trong ứng dụng để đáp ứng các phụ thuộc khác nhau giữa các thư viện. Nó không có vẻ hoạt động rất tốt ở đây, mặc dù, trừ khi tôi đang thiếu một cái gì đó.
Bất kỳ ý tưởng nào?
Tùy chọn trình liên kết '-Bsymbolic' và' --exclude-libs' sẽ giúp bạn nếu bạn liên kết libstdC++ tĩnh tĩnh thành một thư viện được chia sẻ. –