これらの概念のいくつかを理解するために、いくつかの簡単な答えを探しています。 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
。