2012-04-04 54 views
9

Tôi đang phát triển một ứng dụng trong C++ 11, sử dụng g ++ - 4.7 và -std = C++ 0x.
Ứng dụng của tôi được liên kết với một số thư viện được chia sẻ được biên dịch bằng g ++ - 4.7, nhưng không có chỉ thị -std = C++ 0x.Khả năng tương thích thư viện giữa C++ 11 và C++ 03

Thật không may, không có gì hoạt động, có nghĩa là tôi có một số hành vi lạ khi sử dụng các lớp thư viện bên ngoài và phương pháp. (Tất nhiên biên dịch ứng dụng của tôi mà không có -std = C++ 0x hoạt động tốt).

  1. Đây có phải là hành vi dự kiến ​​hoặc đó là lỗi trình biên dịch?

  2. Bất kỳ giải pháp nào (giống như từ khóa extern C)?

+1

Tại sao bạn không thể biên dịch lại thư viện bằng '-std = C++ 0x'? – leftaroundabout

+4

Rõ ràng là vi phạm yêu cầu rằng tất cả các đơn vị dịch sẽ thấy cùng một mã nếu bạn biên dịch một TU với một chế độ xem các tiêu đề thư viện và một TU khác với một chế độ xem khác. –

+1

Soạn thảo với các cờ khác nhau là một trong những con đường ngắn nhất để chứng điên cuồng. Nó được nhiều hơn hoặc ít hơn cho cảnh báo và mức độ tối ưu hóa, nhưng khi nó ảnh hưởng đến việc giải thích của mã nguồn hoặc bố trí của các tập tin nhị phân sản xuất ... hum. –

Trả lời

10

Thư viện chuẩn đã thay đổi và cờ biên dịch -std=c++0x sẽ xác định phần nào của thư viện đang được sử dụng. Bằng cách cố gắng sử dụng cả hai phiên bản trong cùng một chương trình bạn đang phá vỡ Quy tắc Một Định nghĩa (đối với mỗi phần tử được sử dụng trong thư viện chuẩn, bạn có hai định nghĩa cho cùng một mã định danh).

Tôi không nghĩ có bất kỳ điều đơn giản nào có thể được thực hiện để khắc phục giới hạn này. Bạn sẽ phải đảm bảo rằng bạn chỉ sử dụng một phiên bản của thư viện (nghĩa là xác định các macro phù hợp trước khi đưa vào tiêu đề chuẩn để vô hiệu hóa C++ 11 bên trong các thư viện đó), và thậm chí sau đó tôi không chắc chắn rằng mã đã tạo sẽ vẫn không phá vỡ ODR (nếu các phần mở rộng C++ 11 biên dịch mã thư viện C++ 03 khác nhau).

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