Gần đây, chúng tôi đã nhận được báo cáo vì GCC 5.1, libstdc++ and Dual ABI. Có vẻ như Clang is not aware of the GCC inline namespace changes, do đó, nó tạo mã dựa trên một bộ không gian tên hoặc ký hiệu, trong khi GCC đã sử dụng một bộ không gian tên hoặc ký hiệu khác. Tại thời gian liên kết, có vấn đề do thiếu biểu tượng.Liên kết các sự cố do biểu tượng với abi :: cxx11?
Nếu tôi phân tích cú pháp trang Dual ABI chính xác, có vẻ như vấn đề xoay vòng trên _GLIBCXX_USE_CXX11_ABI
và abi::cxx11
với một số khó khăn bổ sung. Đọc thêm có sẵn trên blog của Red Hat tại GCC5 and the C++11 ABI và The Case of GCC-5.1 and the Two C++ ABIs.
Dưới đây là từ máy Ubuntu 15. Máy cung cấp GCC 5.2.1.
$ cat test.cxx
#include <string>
std::string foo __attribute__ ((visibility ("default")));
std::string bar __attribute__ ((visibility ("default")));
$ g++ -g3 -O2 -shared test.cxx -o test.so
$ nm test.so | grep _Z3
...
0000201c B _Z3barB5cxx11
00002034 B _Z3fooB5cxx11
$ echo _Z3fooB5cxx11 _Z3barB5cxx11 | c++filt
foo[abi:cxx11] bar[abi:cxx11]
Làm cách nào để tạo một nhị phân có biểu tượng sử dụng cả trang trí ("cùng tồn tại" như blog Red Hat gọi)?
Hoặc các tùy chọn có sẵn cho chúng tôi là gì?
Tôi đang cố gắng đạt được "nó chỉ hoạt động" cho người dùng. Tôi không quan tâm nếu có hai ký hiệu yếu với hai hành vi khác nhau (std::string
thiếu bản sao ghi-on-write, trong khi std::string[abi:cxx11]
cung cấp sao chép-ghi-ghi). Hoặc, người ta có thể là bí danh cho người khác.
Debian có một số lượng lỗi tương tự tại số Debian Bug report logs: Bugs tagged libstdc++-cxx11. Giải pháp của họ là xây dựng lại tất cả mọi thứ theo ABI mới, nhưng nó không xử lý được trường hợp góc của các trình biên dịch trộn/kết hợp với các thay đổi của ABI.
Trong thế giới Apple, tôi nghĩ rằng điều này là gần với một chất béo nhị phân. Nhưng tôi không chắc phải làm gì trong thế giới Linux/GCC. Cuối cùng, chúng tôi không kiểm soát cách xây dựng thư viện của distro và chúng tôi không kiểm soát những trình biên dịch nào được sử dụng để liên kết ứng dụng với thư viện.
Sản phẩm của bạn là gì? Thư viện hoặc chương trình? –
@ n.m. - Sản phẩm là [Crypto ++] của Wei Dai (http://www.cryptopp.com/). Thư viện C++ của nó. Nó được xây dựng bởi Debian và được cung cấp như một phần của bản phân phối. – jww