Chúng tôi muốn tạo một thư viện được chia sẻ (.so) để nhắm mục tiêu tất cả các bản phân phối, bao gồm cả các bản phân phối cũ. Mã được viết bằng C++ và sử dụng các tính năng C++ 11, vì vậy trình biên dịch phải có ít nhất gcc 4.7. Chúng tôi nhận thấy rằng nếu chúng tôi biên dịch mã của chúng tôi trên máy Linux có cài đặt gcc 4.7.2 (ví dụ: Ubuntu 12.10) thì phiên bản được tạo ra có "phiên bản 1 (GNU/Linux)" trong khi trên hệ điều hành cũ hơn (ví dụ: CentOS 5.6) phiên bản là "phiên bản 1 (SYSV)" - và các thư viện có phiên bản mới hơn của GNU/Linux không thể được sử dụng trên hệ điều hành cũ hơn. Vì vậy, chúng tôi đã thử cách tiếp cận của việc cài đặt gcc 4.7 trên máy CentOS 5.6, biên dịch mã của chúng tôi với trình biên dịch này và liên kết tĩnh với libstdC++ (-static-libstdC++) - điều này tạo ra .so có thể sử dụng được trên mọi linux chúng tôi tìm thấy .Biên soạn một thư viện được chia sẻ trên Linux để nhắm mục tiêu tất cả các bản phân phối
Và điều này làm việc tốt cho 32-bit. Tuy nhiên, khi chúng tôi theo cùng một cách tiếp cận trên một hệ điều hành 64-bit (CentOS) điều này không thành công với lỗi mà libstdC++ hiện có mà chúng tôi đã thử liên kết đến được biên dịch mà không có -fPIC. .
Vì vậy, chúng tôi đã cố gắng để biên dịch gcc 4.7.2 nguồn với tùy chọn “-với-pic”, nhưng chúng tôi không thể liên kết đến các libstdC++ mới a - lỗi là:
/opt/centos/devtoolset-1.1/root/usr/libexec/gcc/x86_64-CentOS-linux/4.7.2/ld: /usr/local/lib/libFoo.so: version node not found for symbol [email protected]_3.4 /opt/centos/devtoolset-1.1/root/usr/libexec/gcc/x86_64-CentOS-linux/4.7.2/ld: failed to set dynamic section sizes: Bad value collect2: error: ld returned 1 exit status
Chúng tôi googled lên rằng biên dịch libstdC++ với –fPIC có thể có vấn đề, nhưng tại sao nó làm việc cho 32-bit và không cho hệ điều hành 64-bit? Có cách nào khác được đề xuất để tạo một .so cho tất cả các bản phân phối Linux không?
Làm thế nào sẽ này thậm chí làm việc? – mjs
+1 Câu hỏi được nghiên cứu kỹ lưỡng! Lỗi này có thể không phải do lỗi của bạn: Tôi googled "không thể đặt kích thước phần động: Giá trị không hợp lệ" và tôi chỉ thấy các báo cáo lỗi sắp xuất hiện. Nhân tiện '_ZNSs7_M_copyEPcPKcm' trong thông báo lỗi là' std :: basic_string, std :: allocator > :: _ M_copy (char *, char const *, unsigned long) '. –
Ali