2011-08-22 33 views
7

khi tôi biên soạn một chương trình C++ trong máy tính của tôi sử dụng g ++ và chuyển thực thi để chạy nó trên máy chủ đại học của tôi, tôi nhận đượclibstdC++ GLIBCXX phiên bản lỗi

./main: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.9' not found (required by ./main) 
./main: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.14' not found (required by ./main) 
./main: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.11' not found (required by ./main) 

Chương trình chạy tốt trên máy tính của tôi, và tôi don không có quyền cài đặt bất kỳ phần mềm mới nào trên máy chủ của trường đại học của tôi.

trợ giúp nào? Cảm ơn

+0

phiên bản libstdC++ trong trường đại học là gì? – phoxis

+0

@phoxis, 3.4.8 hoặc cũ hơn, có vẻ như. – bdonlan

Trả lời

7

Có vẻ như bạn đang sử dụng thư viện chuẩn làm thư viện được chia sẻ (hành vi mặc định) khi liên kết chương trình ở nhà.

Vì vậy, thay vì thực sự "liên kết" thư viện, trình liên kết của bạn chỉ giải quyết một số biểu tượng và thực hiện một thao tác khác, đồng thời trì hoãn việc tải thư viện thực tế về thời gian chạy.

Khi bạn thực hiện chương trình tại máy tính đại học, trình tải (chương trình thực sự tải chương trình của bạn vào bộ nhớ và ném chủ đề chính) tìm thư viện mà chương trình của bạn cần và cố gắng tải chúng (tìm LD_LIBRARY_PATH trong linux nếu bạn cảm thấy tò mò).

Vấn đề ở đây là bạn đang liên kết chương trình của bạn ở nhà với một phiên bản của stdlib mà không phải là phiên bản tương tự như những gì bạn có tại trường đại học. Vì vậy, khi bộ nạp tìm cách tìm thư viện, nó không thành công và do đó chương trình của bạn không thể chạy được.

Giải pháp:

a) Để tránh tất cả những vấn đề sử dụng tĩnh liên kết thay vì liên kết động. Tôi không chắc chắn nếu điều này là có thể với stdlib, nhưng tôi nghĩ rằng nó là giá trị để kiểm tra nó (xem: http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html và tìm cờ "-static")

b) Bạn có thể thử để biên dịch chương trình của bạn tại máy tính trường đại học của bạn vì vậy nó sẽ sử dụng phiên bản ở đó.

c) Cố gắng biết phiên bản stdlib nào được cài đặt ở đó và cài đặt cùng phiên bản trong máy biên dịch của bạn.

d) Bạn có thể cố gắng sao chép phiên bản nhà của bạn của stdlib vào cùng một thư mục ứng dụng của bạn.Điều này thường hoạt động vì trình tải có xu hướng tìm kiếm thư viện được chia sẻ trong thư mục ứng dụng hiện tại trước khi tìm trong đường dẫn được đặt trong biến môi trường LD_LIBRARY_PATH (linux)

Hy vọng điều đó sẽ hữu ích.

P.S .: Ở đây bạn có một giới thiệu tốt đẹp để tĩnh vs chia sẻ/thư viện động http://www.network-theory.co.uk/docs/gccintro/gccintro_25.html

Và đây (http://en.wikipedia.org/wiki/Library_%28computing%29) mô tả thư viện không quá đẹp, nhưng hoàn chỉnh hơn.

+1

Một tùy chọn tốt hơn '-static' sẽ là' -static-libstdC++ 'chỉ liên kết libstdC++ tĩnh, chứ không phải toàn bộ chương trình. –

4

Phiên bản libstdc++.so.6 quá cũ trên máy tính của trường đại học. Bạn có hai tùy chọn:

  1. Liên kết tĩnh với -static. Thư viện C++ sau đó sẽ được hợp nhất thành nhị phân cuối cùng.
  2. Sao chép đúng phiên bản vào một nơi nào đó trong thư mục chính của bạn, sau đó tham chiếu bằng cách chuyển -rpath /path/to/library/directory vào thời gian xây dựng hoặc đặt biến môi trường LD_LIBRARY_PATH để trỏ đến thư mục chứa libstdc++.so.6 mới hơn.
+0

cảm ơn nhiều bdonian, liệu liên kết tĩnh làm cho chương trình chạy chậm hơn khi được thực hiện trong các máy chủ của trường đại học? – Tarek

+0

@ Tarek, liên kết tĩnh có nhiều ưu điểm và nhược điểm khác nhau, nhưng tôi không nghĩ bạn sẽ thấy nhiều sự khác biệt về tốc độ, thực sự. – bdonlan

+0

như @bdonian cho biết có rất nhiều ưu và nhược điểm, nhưng trong trường hợp của bạn, kích thước chính sẽ là kích thước. Một chương trình liên kết tĩnh lớn hơn một chương trình được liên kết động bởi vì trong một chương trình được liên kết tĩnh, các thư viện được "đưa vào" bên trong tệp thực thi. – thamurath

1

Bạn đang cố gắng biên dịch nền tảng nào? tức là 'Máy tính của bạn' và 'Máy chủ đại học' của bạn?

Bạn có thể thử biên dịch chương trình của mình bằng tùy chọn liên kết tĩnh. Điều này sẽ tạo ra một tệp thực thi được liên kết tĩnh với tất cả các phụ thuộc lib đã được tải.

Chúc mừng,

3

Bạn có thể sao chép các phiên bản của /usr/lib/libstdc++.so.6 đến một thư mục con của thư mục chính của bạn của máy chủ, nói ~/lib và sau đó chạy:

$ LD_LIBRARY_PATH=$HOME/lib ./main 

Hoặc nếu bạn thích

$ export LD_LIBRARY_PATH=$HOME/lib 
$ ./main 

Và chương trình nên tải thư viện riêng của bạn thay vì thư viện hệ thống.

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