/usr/lib/libstdc++.so.6: phiên bản `GLIBCXX_3.4.15 'không tìm thấy


135

Làm cách nào tôi có thể nhận GLIBCXX_3.4.15 trong Ubuntu? Tôi không thể chạy một số chương trình mà tôi đang biên dịch.

Khi tôi làm:

strings /usr/lib/libstdc++.so.6 | grep GLIBC

Tôi có:

GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_3.4.14
GLIBC_2.2.5
GLIBC_2.3
GLIBC_2.4
GLIBC_2.3.4
GLIBC_2.3.2
GLIBCXX_FORCE_NEW
GLIBCXX_DEBUG_MESSAGE_LENGTH

Cảm ơn vì bất kì sự giúp đỡ!

Câu trả lời:


81

Tôi đang biên dịch gcc 4.6 từ nguồn và rõ ràng

sudo make install 

đã không bắt được cái này. Tôi đào xung quanh và tìm thấy

gcc/trunk/x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.15

Tôi đã sao chép nó vào / usr / lib và chuyển hướng libstdc ++. So.6 để trỏ đến cái mới, và bây giờ mọi thứ đều hoạt động.


1
Tôi đã có cùng một vấn đề, và bài đăng / câu trả lời này chính xác là những gì tôi đang tìm kiếm. Cảm ơn rất nhiều!
yoco

1
Điều này cũng hoạt động với gcc 4.6.2, ngoại trừ libstdc ++. So.6.0.16. Cảm ơn!
Venesectrix

2
Của tôi là gcc 4.7 và libstdc ++. So.6.0.17. Có cùng một vấn đề, cố định với giải pháp này. Thanh danh.
Ricbit

1
Có, có. Một apt-getgiải pháp dựa trên vấn đề này được mô tả ở đây: superuser.com/questions/310809/iêu
aroth

4
@roosevelt: đó không phải là vấn đề với HĐH, đó là vấn đề với người dùng tự cài đặt phần mềm sau đó không sử dụng trình liên kết chính xác. Đó là Câu hỏi thường gặp: gcc.gnu.org/onlinesocs/libstdc++/faq.html#faq.how_to_set_paths
Jonathan Wakely

54

Tôi đã tránh vấn đề này trong quá khứ bằng cách liên kết tĩnh libstdc ++ với tham số này được gửi đến g ++ khi liên kết tệp thực thi của tôi:

-static-libstdc++

Nếu liên kết trong thư viện tĩnh là một tùy chọn thì đây có lẽ là công việc nhanh nhất.


2
Cảm ơn rất nhiều, tôi đã thử mọi giải pháp khác được đề xuất trên SO và không có gì hiệu quả ngoài giải pháp này.
Itamar Katz

1
Cảm ơn giải pháp của bạn, nó giúp tôi rất nhiều!
Brightshine

Vấn đề là thư viện không thể được tìm thấy, không phải là bạn nên liên kết tĩnh. Xem câu trả lời từ @Hobo.
Dan Mergens

45

Tôi đã cố gắng để clang hoạt động (cũng cần 6.0.15), và trong khi chọc xung quanh tôi thấy nó đã được cài đặt tại /usr/local/lib/libstdc++.so.6.0.15. Nó được cài đặt ở đó khi tôi cài đặt than chì (một phiên bản gcc thử nghiệm).

Nếu bạn cần truy cập vào các thư viện tại địa điểm đó, thì bạn sẽ cần xác định LD_LIBRARY_PATHlà:

export LD_LIBRARY_PATH=/usr/local/lib:/usr/lib:/usr/local/lib64:/usr/lib64

Tôi đã có thể có được tiếng kêu để làm việc sau khi làm điều này. Hy vọng rằng nó hữu ích cho một ai đó.


Tôi đã làm việc trên một mục tiêu nhúng và tôi gặp vấn đề tương tự, giải pháp của bạn dường như không hoạt động trong trường hợp của tôi. Trong thực tế, hầu hết các nhị phân trong mục tiêu đều sử dụng thư viện c mặc định trong / lib, do đó việc thay đổi LD_LIBRARY_PATHsẽ ảnh hưởng đến chúng. họ sẽ tất cả các liên kết đến các thư viện mới, Cuối cùng hầu hết các mã nhị phân không làm việc: như ls grep, ....: I'am nhận:ls: error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory
Mouin

14

Tôi gặp phải vấn đề này khi cố gắng sử dụng matlab eng để gọi các hàm m từ mã c. xảy ra với lệnhmex -f .. ..

Giải pháp của tôi:

strings /usr/lib/i386-<tab>/libstdc++.so.6 | grep GLIBC

Tôi tìm thấy nó bao gồm 3,4,15

vì vậy hệ thống của tôi có libs mới nhất.

vấn đề xuất phát từ chính matlab, nó gọi libstdc ++ của chính nó. so.6 từ {MATLAB}/bin

Vì vậy, chỉ cần thay thế nó bằng lib hệ thống cập nhật.


Điều này dường như cũng hoạt động với tôi trong Matlab 2013b x64 trên Xubfox 13.04 x64
Marcin

Cảm ơn rất nhiều. Tôi chỉ cần tạo một liên kết tượng trưng mới cho tập tin vào {MATLAB}/bintập tin /usr/lib/, và sau đó để khởi động lại MATLAB. Điều này hoạt động trong Matlab 2010b trên Fedora 14 x64.
Chảo

2

Tôi đã nhận được cùng một lỗi. Đây là cách nó làm việc cho tôi:

  • làm sạch dự án theo gcc hiện đang cài đặt
  • biên dịch lại nó

Làm việc hoàn hảo!


2

Đối với lỗi này, tôi đã sao chép libstdc ++ mới nhất. So.6.0.17 từ máy chủ khác và xóa liên kết mềm và tạo lại nó.

1. Sao chép libstdc ++. So.6.0.15 hoặc mới nhất từ ​​máy chủ khác sang hệ thống bị ảnh hưởng.
Trong trường hợp của tôi, SUSE linux 11 SP3 đã có bản mới nhất.
2. rm libstdc ++. So.6
3. ln -s libstdc ++. So.6.0.17 libstdc ++. So.6 (thư mục / usr / lib64).

anh trai


2

Tôi vừa phải đối mặt với vấn đề tương tự xây dựng phiên bản LLVM 3.7. trước tiên hãy kiểm tra xem bạn đã cài đặt thư viện cần thiết trên hệ thống của mình chưa:

$locate libstdc++.so.6.*

Sau đó, thêm vị trí tìm thấy vào biến môi trường $ LD_LIBRARY_PATH của bạn.


2
Điều này chỉ hoạt động, nếu bạn có libstdc ++. So.6. * Lib với hỗ trợ
GLIBCXX_3.4.15

2

Đôi khi bạn không điều khiển máy đích (ví dụ: thư viện của bạn cần chạy trên hệ thống doanh nghiệp bị khóa). Trong trường hợp như vậy, bạn sẽ cần biên dịch lại mã của mình bằng phiên bản GCC tương ứng với phiên bản GLIBCXX của họ. Trong trường hợp đó, bạn có thể làm như sau:

  1. Tra cứu phiên bản mới nhất của GLIBCXX được máy đích hỗ trợ: strings /usr/lib/libstdc++.so.6 | grep GLIBC... Giả sử phiên bản là 3.4.19.
  2. Sử dụng https://gcc.gnu.org/onlinesocs/libstdc++/manual/abi.html để tìm phiên bản GCC tương ứng. Trong trường hợp của chúng tôi, đây là [4.8.3, 4.9.0).

1

gcc phiên bản 4.8.1, lỗi có vẻ như:

/ root / bllvm / build / Release + Asserts / bin / llvm-tblgen: /usr/lib64/libstdc++.so.6: không tìm thấy phiên bản `GLIBCXX_3.4.15 ' bin / llvm-tblgen)

Tôi đã tìm thấy libstdc ++. So.6.0.18 tại nơi tôi tuân thủ gcc 4.8.1

Sau đó tôi làm như thế này

cp ~/objdir/x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.18 /usr/lib64/

rm /usr/lib64/libstdc++.so.6

ln -s libstdc++.so.6.0.18 libstdc++.so.6

Vấn đề được giải quyết.


1

Tôi đã trích xuất chúng từ RPM ( RPM cho libstdc ++ ) và sau đó:

export LD_LIBRARY_PATH=.

Để thiết lập hệ thống để tìm kiếm các thư viện trên thư mục hiện tại. Sau đó, chỉ cần thực hiện chương trình của tôi. Nhưng trong trường hợp của tôi, tôi đã nhận được một thực thi duy nhất mà tôi cần, đó không phải là một sự thay đổi toàn hệ thống.


0

Tôi đã gặp một vấn đề tương tự và tôi đã giải quyết nó bằng cách liên kết tĩnh libstdc++với chương trình tôi đang biên dịch, như vậy:

$ LIBS=-lstdc++ ./configure ... etc.

thay vì thông thường

$ ./configure ... etc.

Có thể có vấn đề với giải pháp này khi tải thư viện dùng chung trong thời gian chạy, nhưng tôi chưa xem xét vấn đề đủ sâu để bình luận.



0

Tôi gặp vấn đề tương tự vì tôi đã thay đổi người dùng từ chính mình sang người khác:

su

Vì một số lý do, sau khi biên dịch bình thường, tôi không thể thực thi nó (cùng một thông báo lỗi). Ssh trực tiếp đến tài khoản người dùng khác hoạt động.


Điều này không thực sự trả lời câu hỏi. Nếu bạn có một câu hỏi khác, bạn có thể hỏi nó bằng cách nhấp vào Đặt câu hỏi . Bạn cũng có thể thêm tiền thưởng để thu hút sự chú ý hơn cho câu hỏi này.
ravron

Không, bởi vì tôi đã có cùng một vấn đề. Nó được gây ra bởi sự thay đổi người dùng. Nó cũng có thể đã xảy ra với người khác, nói thay đổi để root.
HelloWorld

Lỗi của tôi! Tôi đã bị ném bởi dòng đầu tiên, có vẻ như bạn cũng có vấn đề. Tiếp tục!
ravron

Tôi cũng đã sử dụng Ubuntu và cũng đã cố gắng biên dịch các chương trình và cũng nhận được thông báo lỗi tương tự như trong câu hỏi. Lỗi của tôi là tôi đã làm điều đó trong một tài khoản người dùng khác bằng cách sử dụng lệnh su. Tôi nghĩ rằng điều này trả lời câu hỏi bởi vì nó giải quyết tại sao và làm thế nào về vấn đề. Đó chắc chắn là một khả năng.
HelloWorld

Và một người dùng đã cài đặt LD_LIBRARY_PATH để tìm lib mới hơn nhưng không phải là người dùng khác? Điều đó có vẻ hơi xa trong bối cảnh cụ thể của câu hỏi này.
Marc Glisse

0

Tôi đã cài đặt nhiều phiên bản trình biên dịch gcc và cần sử dụng phiên bản mới hơn cài đặt mặc định. Vì tôi không phải là quản trị viên hệ thống cho các hệ thống Linux của chúng tôi, tôi không thể thay đổi / usr / lib hoặc nhiều đề xuất khác ở trên. Tôi đã gặp phải vấn đề này và cuối cùng đã theo dõi nó để đặt đường dẫn của tôi đến thư mục thư viện 32 bit thay vì thư mục thư viện 64 bit (lib64). Do các thư viện trong thư mục 32 bit không tương thích, nên hệ thống được mặc định là phiên bản cũ hơn đã lỗi thời.

Sử dụng -L vào đường dẫn mà tôi đã tham chiếu đã đưa ra cảnh báo về việc "bỏ qua libstdc ++ không tương thích. Vì vậy, khi tìm kiếm -lstdc ++". Đây là gợi ý giúp tôi cuối cùng giải quyết vấn đề.


0

Điều tương tự với phiên bản gcc 4.8.1 (GCC)libstdc++.so.6.0.18. Phải sao chép nó ở đây /usr/lib/x86_64-linux-gnutrên hộp ubfox của tôi.


0

Trong trường hợp của tôi, LD_LIBRARY_PATH đã có / usr / lib64 trước / usr / local / lib64. (Tôi đã builing llvm 3.9).
Trình biên dịch gcc mới mà tôi đã cài đặt để biên dịch llvm 3.9 có các thư viện sử dụng các thư viện GLIBCXX mới hơn trong / usr / local / lib64 Vì vậy, tôi đã sửa LD_LIBRARY_PATH cho trình liên kết để xem / usr / local / lib64 trước tiên.
Điều đó đã giải quyết vấn đề này.


0

Tôi chỉ sử dụng -static-libstdc ++ trong khi xây dựng. w / đó, tôi có thể chạy a.out

g++ test.cpp -static-libstdc++

0

Đối với mục đích thử nghiệm:

Trên máy gốc, tìm thư viện, sao chép vào cùng thư mục với tệp thực thi:

$ ldconfig -p | grep libstdc
        libstdc++.so.6 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libstdc++.so.6
        libstdc++.so.6 (libc6) => /usr/lib32/libstdc++.so.6
$ cp /usr/lib/x86_64-linux-gnu/libstdc++.so.6 .

Sau đó sao chép cùng thư viện này vào máy đích và chạy tệp thực thi:

LD_LIBRARY_PATH=. ./myexecutable

Lưu ý: lệnh trên là tạm thời; nó không phải là một sự thay đổi toàn hệ thố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.