2013-02-20 30 views
17

Tôi muốn di chuyển dự án hiện tại của mình sang C++ 11. Mã tất cả các biên dịch sử dụng clang ++ -std = C++ 0x. Đó là phần dễ dàng :-) . Phần khó khăn là đối phó với các thư viện bên ngoài. Người ta không thể dựa vào việc liên kết một đối tượng C++ 11 với các thư viện bên ngoài mà không được biên dịch với C++ 11 (xem http://gcc.gnu.org/wiki/Cxx11AbiCompatibility). Ví dụ, Boost, chắc chắn cần tái xây dựng (Why can't clang with libc++ in c++0x mode link this boost::program_options example?). Tôi có nguồn cho tất cả các thư viện bên ngoài tôi sử dụng, vì vậy tôi có thể (với một số cơn đau) về mặt lý thuyết xây dựng lại các libs với C++ 11. Tuy nhiên, điều đó vẫn khiến tôi gặp phải một số vấn đề:Quản lý thư viện bên ngoài (ví dụ: tăng cường) trong khi chuyển đổi sang C++ 11

Phát triển trong hỗn hợp C++ 03/C++ 11 môi trường: Tôi có một số dự án cũ sử dụng C++ 03 yêu cầu bảo trì định kỳ. Tất nhiên, tôi sẽ muốn liên kết chúng với các phiên bản hiện tại của các thư viện bên ngoài. Nhưng đối với các dự án hiện tại (và mới) của tôi, tôi muốn liên kết với các phiên bản C++ 11 được xây dựng lại của các thư viện. Làm cách nào để tổ chức các môi trường phát triển của tôi (hiện tại là Ubuntu 12.04 và Mac OS X 10.7) để đối phó với điều này?

Tôi cho rằng vấn đề này sẽ phải đối mặt với nhiều nhà phát triển. Nó sẽ không biến mất, nhưng tôi đã không tìm thấy một giải pháp được khuyến nghị và được chấp thuận chung.

Triển khai: Hiện tại, tôi triển khai cho Ubuntu 12.04 máy chủ LTS trong đám mây. Trải nghiệm dẫn đến một phụ thuộc (nếu có thể) trên các gói tiêu chuẩn (ví dụ: libboost) có sẵn với bản phân phối Linux. Nếu tôi chuyển dự án hiện tại của mình sang C++ 11, sự hiểu biết của tôi là tôi sẽ phải xây dựng các phiên bản riêng của các thư viện bên ngoài mà tôi sử dụng. Tôi đoán là ở một thời điểm nào đó điều này sẽ thay đổi, và chúng sẽ là phiên bản 'chuẩn' của các gói thư viện với khả năng tương thích C++ 11. Có ai có bất kỳ ý tưởng khi người ta có thể mong đợi điều đó xảy ra? Và có lẽ điều này cũng sẽ yêu cầu một giải pháp tiêu chuẩn cho vấn đề được đề cập ở trên - đồng thời tồn tại của C++ 03 libs và C++ 11 libs trên cùng một nền tảng.

Tôi hy vọng rằng tôi đã bỏ lỡ điều gì đó cơ bản để những vấn đề nhận thức này biến mất trong một loạt thông tin thích hợp! Tôi có cố gắng chuyển sang C++ 11 quá sớm không?

Cập nhật (2013/09/11): thảo luận có liên quan cho macports: https://lists.macosforge.org/pipermail/macports-users/2013-September/033383.html

+3

"Làm cách nào để tổ chức các môi trường phát triển của tôi ... để đối phó với điều này?" - điều chỉnh cơ chế xây dựng của bạn để vượt qua các đường dẫn thư viện khác nhau; cho Clang và GCC, '-L' là bạn của bạn. – Xeo

+0

@Zeo, tôi quen thuộc với -L. Tôi không hiểu tại sao Clang lại có một con đường thư viện khác để GCC giải quyết vấn đề. Có lẽ bạn có thể xây dựng? Nếu tôi cần tạo quy trình riêng cho việc xây dựng các thư viện bên ngoài 'chuẩn' khác nhau thành các thư mục khác nhau (có thể là một cho C++ 11, một cho C++ 03 và một cho libs hoạt động với cả hai), thì tôi tại một nơi tôi muốn tránh, và một mà tôi sẽ được chia sẻ với hàng chục nhà phát triển phát minh (biến thể nhỏ) cùng một bánh xe. Đó có phải là nó sẽ như thế nào? –

+0

Vì vậy, ...bạn biên dịch với clang nhưng sử dụng tài liệu ABI gcc? :) –

Trả lời

1

Bạn nên sử dụng toolchain cấu hình của bạn (ví dụ autotools) để "đúng cách" cấu hình xây dựng của bạn cho việc triển khai mục tiêu của bạn. Thử nghiệm cấu hình của bạn nên kiểm tra các tệp nhị phân tương thích với ABI tương ứng với ABI và hướng dẫn trình liên kết sử dụng chúng trước nếu được phát hiện. Nếu không, tùy chọn không thành công hoặc dự phòng thành bản dựng C++ 03.

Đối với C++ 11 thư viện phần thứ ba được cài đặt trong một cây thư mục song song riêng biệt, điều này là không cần thiết. Phiên bản thư viện đã tồn tại trong một thời gian dài và cho phép bạn đặt các phiên bản khác nhau cạnh nhau trên hệ thống hoặc bất cứ nơi nào bạn muốn, lại dựa trên cấu hình.

Điều này có vẻ lộn xộn, nhưng các khung công cụ định cấu hình được thiết kế để xử lý các mớ hỗn độn này.

+0

những âm thanh này giống như các công cụ thích hợp cho công việc. Làm thế nào để "kiểm tra ABI tương thích với C++ 11 nhị phân?". Với các phiên bản khác nhau (C++ 03, C++ 11) của các phiên bản libs bên ngoài trong cùng một thư mục, có thể kiểm tra tương tự cả hai cho khả năng tương thích ABI không? Hay không, ví dụ, cần thiết lập các liên kết tượng trưng khớp với tùy chọn liên kết -l? –

+0

Vâng, có vẻ như lộn xộn! Quá lộn xộn cho tôi để cố gắng hiện tại (tôi đã luôn luôn tìm thấy autoconf đáng sợ!) Trừ khi tôi có thể sao chép những gì người khác quen thuộc hơn với các công cụ đã làm. –

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