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は存在しません。今、最初の2つの質問があります。

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

おすすめ記事