2010-04-26 44 views
5

Tôi muốn xây dựng chương trình của mình bằng trình biên dịch LSB C++ từ Cơ sở tiêu chuẩn Linux http://www.linuxfoundation.org/collaborate/workgroups/lsb. Chương trình phụ thuộc vào thư viện Boost, được xây dựng với phiên bản gcc 4.4. Biên dịch không thành công. Có thể xây dựng thư viện Boost với trình biên dịch LSB C++ không? Ngoài ra, có thể xây dựng thư viện Boost với một số phiên bản gcc cũ, phiên bản nào được khuyến nghị không? Mục tiêu cuối cùng của tôi là lấy các thư viện Boost và các thư viện Boost của bên thứ ba chạy trên hầu hết các bản phân phối Linux.Xây dựng Boost với trình biên dịch LSB C++

Nói chung, bạn có thể làm gì để có được khả năng tương thích nhị phân tốt hơn cho bản phân phối Linux, phát triển ứng dụng mã nguồn đóng C++ tùy thuộc vào thư viện Boost?

+0

Vì khi nào LSB là trình biên dịch? Tôi nghĩ rằng nó chỉ là một đặc điểm kỹ thuật của thư viện và các tiện ích cần được cài đặt và có sẵn trên một bản phân phối Linux (để các thư viện và tiện ích khác có thể phụ thuộc vào chúng đang ở đó). –

+0

Michael Aaron Safyan: Dự án LSB cung cấp trình biên dịch C++ của riêng họ, có thể được sử dụng thay cho GCC, và phải tạo ra các tệp nhị phân tương thích với tất cả các bản phân phối Linux. Thật vậy, bằng cách sử dụng trình biên dịch này cho mã của riêng tôi cho kết quả tốt. Tuy nhiên, tôi có vấn đề với thư viện của bên thứ ba được sử dụng trong dự án của tôi. –

+0

@Michael, LSB là một bộ thông số kỹ thuật, nhưng nhóm làm việc cũng cung cấp các công cụ giúp phát triển các chương trình phù hợp với các thông số kỹ thuật này. Xem tại đây http://ldn.linuxfoundation.org/lsb/porting-lsb-demo và tại đây http://www.linuxfoundation.org/collaborate/workgroups/linux-standard-base-lsb/lsb-sdk-403 –

Trả lời

3

Trình biên dịch LSB C++ không thực sự là trình biên dịch. Thực thi lsbc++ là trình bao bọc xung quanh trình biên dịch GCC được cài đặt trên hệ thống của bạn (trình biên dịch thực tế có thể được điều khiển thông qua tùy chọn --lsb-cxx). Bạn sẽ rất có thể hack vào hệ thống tăng cường xây dựng cho nó để gọi LSB wrapper thay vì trình biên dịch gcc.

Vì vậy, các vấn đề có thể phát sinh nhiều khả năng không phải là trình biên dịch LSB không thể biên dịch cấu trúc ngôn ngữ, mà thay vào đó, có một số vấn đề liên kết.

Ví dụ, trình biên dịch LSB theo mặc định loại bỏ mọi thư viện được chia sẻ mã được liên kết, trừ khi chúng thuộc về LSB. Điều này có thể dẫn đến các lỗi liên kết nếu BOOST dựa vào các thư viện đó. Điều này có thể được kiểm soát thông qua biến môi trường LSBCC_SHAREDLIBS, nhưng bạn nên chắc chắn rằng bạn gửi các libs cùng với sản phẩm của bạn.

Một vấn đề khác là LSB rơi sau phiên bản trình biên dịch GCC (và BOOST có thể bò vào tất cả các góc tối của trình biên dịch). Theo như tôi biết, GCC 4.4 không được kiểm tra đầy đủ, vì vậy bạn nên thử nó với trình biên dịch 4.3.

Và Google dường như không tìm thấy bất kỳ điều gì liên quan đến việc tăng cường xây dựng với LSBCC, vì vậy nếu bạn quản lý, vui lòng chia sẻ kinh nghiệm của bạn, ví dụ như câu trả lời cho câu hỏi của bạn.

+0

Tôi đã cố gắng xây dựng tệp Boost thay thế g ++ bằng liên kết tới lsbC++. Kết quả là việc biên soạn nhiều thư viện không thành công. Tôi sẽ thử phiên bản GCC 4.3, cảm ơn bạn vì thông tin này. –

+0

@ Alex, tôi hy vọng rằng cùng với việc thay thế liên kết bạn cũng chỉ 'lsbC++' thành trình biên dịch thực, vì vậy nó không recurse :-D. Dù sao, bạn cũng có thể tìm cách được trợ giúp trong danh sách gửi thư của LSB: https://lists.linux-foundation.org/mailman/listinfo/lsb-discuss Định dạng danh sách gửi thư phù hợp hơn để thảo luận các lỗi cụ thể với nhật ký lỗi hơn StackOverflow . –

+0

Sử dụng GCC 4.3 không giúp được gì, tôi vẫn không thể sử dụng trình biên dịch lsbC++ cho các thư viện của bên thứ ba. Tuy nhiên, tôi có một số kết quả với LSB Application Checker. Bằng cách thêm các thư viện bị thiếu vào gói của tôi, tôi đã quản lý để nhận được 49 trong số 50 bản phân phối Linux tương thích cho chương trình bằng cách sử dụng thư viện Boost ASIO. Loại thành công ... Cảm ơn sự giúp đỡ của bạn. –

6

Gần đây tôi đã gọi điện để làm điều này, trong trường hợp đó là sử dụng cho bất cứ ai khác đó là những bước tôi đi theo:

  • Tải về và cài đặt các LSB SDK
  • Tải về một phiên bản của tăng và trích xuất/opt/boost/boost_ < phiên bản > (Tôi đã sử dụng 1.43)
  • Đảm bảo cài đặt libbz2-dev.
  • Bootstrap với
cd /opt/boost/boost_<version> 
./bootstrap.sh --prefix=/opt/boost --without-libraries=python,mpi --without-icu 
  • Sửa /opt/boost/boost_<version>/project-config.jam và thêm dòng
using gcc : : /opt/lsb/bin/lsbc++ : <cflags>-U_GNU_SOURCE <cxxflags>-U_GNU_SOURCE ; 

gần phía trên cùng của tập tin. Lưu ý rằng điều này sẽ thất bại nếu bạn có một khai báo bằng cách sử dụng một trong các tập tin khác bjam đọc cấu hình của nó từ, bạn có thể vượt qua --debug-configuration để có được một ý tưởng về các tập tin mà nó đọc.

  • Run
./bjam cflags=-fPIC cxxflags=-fPIC linkflags=-fPIC install 

Tôi không cố gắng để có được một trong hai python hoặc thư viện MPI làm việc, tôi cũng không cố gắng để có được ICU làm việc với thư viện boost.regex. Sau này có lẽ là một trường hợp xây dựng các phiên bản tĩnh của các thư viện ICU với bộ công cụ LSB.

-fPIC không thực sự cần thiết đối với Linux 32 bit, nhưng là bắt buộc nếu bạn muốn liên kết các thư viện tĩnh thành thư viện dùng chung cho Linux 64 bit.

Kết quả cuối cùng phải là nhị phân trong /opt/boost/lib và tiêu đề trong /opt/boost/include, rõ ràng là bạn có thể sửa đổi tiền tố cho phù hợp với tùy chọn của riêng bạn. Tôi vẫn còn một số lượng công việc phải làm trước khi tôi chuyển tất cả mã của mình sang LSB, vì vậy tôi không thể báo cáo về quá trình chứng nhận được thực hiện tốt như thế nào.

+0

Thú vị, cảm ơn. Hiện tại tôi đang sử dụng các công cụ tự động để giải quyết vấn đề tương thích nhị phân. Tôi sẽ giữ câu trả lời của bạn để tham khảo trong tương lai. –

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