libstdc++.so.6 및 GLIBCXX_3.4.20은 무엇입니까?

libstdc++.so.6 및 GLIBCXX_3.4.20은 무엇입니까?

이러한 개념 중 일부를 이해할 수 있도록 몇 가지 간단한 답변을 찾고 있습니다. R 라이브러리를 설치하려고 하는데 다음 오류로 인해 실패합니다. /lib64/libstdc++.so.6: version ``GLIBCXX_3.4.20'' not found

나는이 정보를 구글링했다. 명령을 실행했습니다(폴더 이름 참고).

[affans@hpc ~]$ strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX
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
GLIBCXX_3.4.15
GLIBCXX_3.4.16
GLIBCXX_3.4.17
GLIBCXX_3.4.18
GLIBCXX_3.4.19
GLIBCXX_DEBUG_MESSAGE_LENGTH

물론 GLIBCXX_3.4.20은 존재하지 않습니다. 이제 처음 두 가지 질문이 있습니다.

1) libstdc++.so.6은 무엇입니까? 이것은 gcc와 함께 제공되는 라이브러리입니까?

2) 차이점은 무엇입니까 GLIBCXX_*? 이것도 도서관인가요?

다음으로 명령을 실행합니다(폴더 구조를 다시 확인하세요!).

[affans@hpc ~]$ strings /usr/local/lib64/libstdc++.so.6 | grep GLIBCXX
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
GLIBCXX_3.4.15
GLIBCXX_3.4.16
GLIBCXX_3.4.17
GLIBCXX_3.4.18
GLIBCXX_3.4.19
GLIBCXX_3.4.20
GLIBCXX_DEBUG_MESSAGE_LENGTH

흥미롭네요... 이제 GLIBCXX_3.4.20이 보입니다! 그러다가 그것이 libstdc++.so.6실제로는 단지 심볼릭 링크라는 것을 깨달았습니다 . 내가 /usr/lib64가지고 있는

[affans@hpc lib64]$ cd /usr/lib64
[affans@hpc lib64]$ ls -l libstdc*
lrwxrwxrwx 1 root root      18 Oct  2 14:00 libstdc++.so.5 -> libstdc++.so.5.0.7
-rwxr-xr-x 1 root root  830776 Mar  5  2015 libstdc++.so.5.0.7
lrwxrwxrwx 1 root root      19 Dec  6 15:47 libstdc++.so.6 -> libstdc++.so.6.0.19
-rwxr-xr-x 1 root root  991616 Aug  6 12:52 libstdc++.so.6.0.19
-rwxr-xr-x 1 root root 8996145 May  6  2019 libstdc++.so.6.0.22 

libstdc++.so.6따라서 이라는 실제 라이브러리를 가리키는 것이 분명합니다 libstdc++.so.6.0.19. 반면에 /usr/local/lib64내가 가질 때는

[affans@hpc lib64]$ cd /usr/local/lib64
[affans@hpc lib64]$ ls -l libstdc*
-rw-r--r-- 1 root root 16733832 May 16  2019 libstdc++.a
-rwxr-xr-x 1 root root      965 May 16  2019 libstdc++.la
lrwxrwxrwx 1 root root       19 May 16  2019 libstdc++.so -> libstdc++.so.6.0.20
lrwxrwxrwx 1 root root       19 May 16  2019 libstdc++.so.6 -> libstdc++.so.6.0.20
-rwxr-xr-x 1 root root  6642616 May 16  2019 libstdc++.so.6.0.20
-rw-r--r-- 1 root root     2313 May 16  2019 libstdc++.so.6.0.20-gdb.py

1) 질문은 왜 다른 폴더에 이러한 라이브러리의 다른 버전이 있습니까?

2) 마지막 질문입니다. gcc런타임에 /usr/local/lib64이전 라이브러리 대신 6.0.20 라이브러리를 사용하도록 어떻게 지시합니까?

답변1

libstdc++.so.6은 무엇입니까? 이것은 gcc와 함께 제공되는 라이브러리입니까?

이는 GCC의 C++ 표준 라이브러리 구현입니다.

차이점은 무엇입니까 GLIBCXX_*? 이것도 도서관인가요?

이는 라이브러리가 API를 변경할 수 있으면서도 이전 버전과의 호환성을 유지하는 데 사용되는 버전 기호입니다. 바라보다ldd 출력에 여러 GLIBC 버전이 있다는 것은 무엇을 의미합니까?더 알아보기.

문제는 왜 다른 폴더에 이러한 라이브러리의 다른 버전이 있습니까?

복사본은 /usr/lib64배포판의 버전입니다. 복사본은 /usr/local/lib64다른 것에 의해 설치됩니다.

이전 버전 대신 6.0.20 라이브러리를 사용하도록 런타임에 gcc어떻게 지시합니까 ?/usr/local/lib64

-L/usr/local/lib64를 사용하여 빌드를 시도 하고 필요한 경우 를 사용하여 실행할 수 있습니다 LD_LIBRARY_PATH=/usr/local/lib64.

관련 정보