什么是 libstdc++.so.6 和 GLIBCXX_3.4.20?

mas*_*nix 6 libraries gcc

我正在寻找一些简单的答案来理解其中的一些概念。我正在尝试安装一个因错误而失败的 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
Run Code Online (Sandbox Code Playgroud)

当然 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
Run Code Online (Sandbox Code Playgroud)

有趣……我现在看到 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 
Run Code Online (Sandbox Code Playgroud)

所以很明显,它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
Run Code Online (Sandbox Code Playgroud)

1)问题是为什么我在不同的文件夹中有这些库的不同版本?

和 2) 最后一个问题,运行时gcc如何告诉它使用 6.0.20 库/usr/local/lib64而不是旧库?

Ste*_*itt 7

什么是 libstdc++.so.6?这只是一个 gcc 附带的库吗?

它是 GCC 对 C++ 标准库的实现。

有什么不同GLIBCXX_*?这些也是图书馆吗?

这些是版本符号,用于允许库保持向后兼容,同时仍然能够更改其 API。请参阅ldd 的输出中多个 GLIBC 版本的含义是什么?详情。

问题是为什么我在不同的文件夹中有这些库的不同版本?

副本/usr/lib64是您发行版的版本;副本/usr/local/lib64是由其他东西安装的。

运行时gcc如何告诉它使用 6.0.20 库/usr/local/lib64而不是旧库?

您可以尝试使用 构建-L/usr/local/lib64,并使用LD_LIBRARY_PATH=/usr/local/lib64(如有必要)运行。