Có thể liên kết một thư viện C ++ 11 (lib, dll, v.v.) trong các trình biên dịch C ++ cũ hơn không?


12

Các trình biên dịch C ++ cũ hơn (ví dụ VS2008 và gcc3.4) có thể liên kết với các thư viện bên ngoài được viết bằng C ++ 11 không?

Tôi nghĩ rằng các tệp C ++ 11 .lib chỉ là mã byte ở giai đoạn này và nó không nên làm phiền các trình biên dịch cũ hơn cách nó được tạo ra, miễn là nó có thể phân giải được và có thể gọi được.

Tôi đang phát triển một thư viện nhỏ có API vẫn hỗ trợ người dùng C ++ 03. Vì vậy, nhìn về phía trước, tôi tự hỏi liệu có ổn không khi triển khai thư viện của mình bằng các tính năng hữu ích như std::unique_ptrthế, hay tôi phải gắn bó với nó boost::?

Câu trả lời:


10

Với điều kiện thư viện của bạn chỉ sử dụng C ++ 11 khi triển khai và không để lộ các phương tiện hoặc loại C ++ 11 công khai, và đặc biệt nếu bạn sử dụng liên kết tĩnh, thì có, điều này là có thể và thậm chí là tiêu chuẩn.

Hãy xem xét trường hợp phổ biến khi thư viện hiển thị giao diện cấp C (có thể được sử dụng bởi nhiều khách hàng nhất) nhưng được triển khai nội bộ trong C ++. Các khách hàng liên kết với thư viện như vậy chỉ cần lo lắng về API nhị phân công khai (các hàm được xuất), mà bạn sẽ bị hạn chế là C / C ++ kế thừa để có khả năng tương thích tối đa. Một chương trình Java có thể liên kết với các API cấp độ C được triển khai nội bộ trong C ++. Điều này không có nghĩa là Java cần "hỗ trợ C ++". Tương tự, ứng dụng khách C / C ++ kiểu cũ có thể liên kết với API cấp độ C hoặc C ++, bên trong sử dụng một số phiên bản tiên phong hơn của lib C ++ hoặc bất kỳ lib nào khác. Hai điều riêng biệt: những gì cần thiết để liên kết với giao diện của thư viện và những gì chính thư viện liên kết với (hoặc kéo vào tĩnh).

Bạn chỉ đơn giản là không đưa khách hàng của thư viện của bạn đến các phụ thuộc của việc triển khai.

Nếu bạn có thể liên kết tĩnh các phụ thuộc của bạn (C ++ 11 hoặc bất cứ thứ gì khác) vào thư viện của bạn, thì đây là mục đích rõ ràng và khép kín. Thư viện là một hộp đen thực sự: không có gì ngoài mã byte. Nhưng ngay cả khi thư viện của bạn liên kết với các phụ thuộc của bạn thông qua liên kết "ẩn động" (không bị nhầm lẫn với loại LoadL Library / GetProcAddress và các phương thức tương tự trên * nix và OS X), các máy khách cũ vẫn có thể liên kết với thư viện đó giao diện công cộng, ngay cả khi chúng không thể liên kết đến các thư viện mà thư viện phụ thuộc vào .


1
Tuyệt quá! Đó chính xác là những gì tôi đã hy vọng. Tôi không có ý định sử dụng C ++ 11 một cách rộng rãi, nhưng thật tuyệt khi biết tôi có thể bật chức năng lambda hoặc hai trong triển khai ẩn của mình khi thuận tiện. Sự tương tự C và Java có ý nghĩa. Cảm ơn bạn.
Konaha

4

Âm thanh như bạn muốn viết thư viện mới cho người khác sử dụng và bạn muốn sử dụng C + 11 làm ngôn ngữ triển khai. Có một số vấn đề cần xem xét:

  • bằng cách giới thiệu một phiên bản mới của C ++, bạn sẽ giới thiệu nhu cầu triển khai các thư viện thời gian chạy C ++ mới với thư viện của mình, điều đó có ổn không?
  • bạn không nên sử dụng các loại C + 11 mới trong giao diện công cộng của mình, nếu không họ sẽ không thể gọi nó.
  • Nói chung, bạn nên tránh các loại phức tạp, chẳng hạn như unique_ptr, thậm chí là vectơ, trừ khi bạn đang phân phối thư viện của mình dưới dạng mã nguồn, bố cục của các đối tượng trong thư viện của bạn có thể khác với bố cục trong mã máy khách. Gắn bó với các loại đơn giản không có nguy cơ biến thể bố cục đối tượng.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.