Tôi đang sử dụng trình biên dịch C++ của Intel, mà trên Linux dựa trên libc.so do GNU cung cấp và libstdC++.Rủi ro của các phiên bản GCC khác nhau tại thời gian liên kết/chạy?
Đây là vấn đề của tôi. Để có quyền truy cập vào một số tính năng mới nhất của C++ 11, tôi cần sử dụng libstdC++ với GCC 4.7 hoặc cao hơn. Nhưng tôi đang bị mắc kẹt bằng cách sử dụng CentOS 6.4.
Trên CentOS 6.4, phiên bản gốc của GCC là 4.4. Nhưng sử dụng một thứ RedHat gọi là "SCL" và một gói có tên "devtoolset-1.1", tôi có thể cài đặt GCC 4.7 trong "/ opt".
Tôi thiết lập mọi thứ để sử dụng GCC 4.7 theo cách đã đề cập ở trên, tôi có thể sử dụng các tính năng C++ 11 mới hơn.
Vì vậy, đây là câu hỏi của tôi: Nếu người dùng chạy chương trình của tôi chỉ với phiên bản GCC 4.4 libc.so/libstdC++. Vì vậy, trong đường dẫn thư viện, có rủi ro là chương trình của tôi sẽ có lỗi do một số không khớp giữa Phiên bản 4.4 và 4.7 của các thư viện đó?
Nếu có vấn đề tiềm ẩn, tôi có thể làm việc xung quanh nó bằng cách liên kết tĩnh trong các phiên bản libc và libstdC++ của GCC 4.7 không? Hoặc là thiết lập bản thân mình cho các vấn đề khác nếu/khi các thư viện khác mà mã của tôi tự động tải lấy libc/libstdc cũ hơn được cung cấp bởi gói GCC 4.4 toàn hệ thống?
Cảm ơn. Vì vậy, nó thực sự đơn giản như đảm bảo rằng libstdC++, do đó, từ GCC 4.7 có trong LD_LIBRARY_PATH của tôi trước bất kỳ phiên bản libstdC++ nào khác, do đó, khi chạy một chương trình được xây dựng dựa trên libstdC++? Nó sẽ không gây ra vấn đề nếu một trong những tệp khác .so mà chương trình của tôi sử dụng có sự phụ thuộc liên kết động chống lại libstdC++, nhưng đối tượng được chia sẻ khác được xây dựng dựa trên phiên bản GCC trước đó? (Nó không nhất thiết phải là kết thúc của thế giới nếu đó là trường hợp, bởi vì chương trình của tôi có rất ít (trực tiếp) phụ thuộc vào các thư viện khác.) –
Không, nó sẽ hoạt động tốt. libstdC++ là tương thích ngược, do đó, 'libstdC++. so.6.0.17' từ 4.7 có thể được sử dụng bởi bất cứ thứ gì được biên dịch với 4.7 hoặc cũ hơn (quay lại GCC 3.4.0, dù sao) nhưng nó không ** tương thích về phía trước, do đó, 'libstdC++. so.6.0.13' từ 4.4 không thể được sử dụng bởi một cái gì đó được biên dịch với 4.7 –
NB Hiện tại không có sự đảm bảo nào về tính tương thích của C++ 11 giữa các bản phát hành libstdC++, vì vậy nếu các thư viện khác mà mã của bạn tải sử dụng các tính năng C++ 11 thì chúng sẽ được biên dịch lại với 4.7, nhưng nếu chúng chỉ sử dụng các tính năng của C++ 03 thì libstdC++ mới hơn sẽ hoạt động tốt. –