これらの概念のいくつかを理解するために、いくつかの簡単な答えを探しています。エラーで失敗している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ライブラリを使用するようにするにはどうすればよいですか?
Libstdc ++。so.6とは何ですか?これはgccに同梱されているライブラリですか?
これは、C++標準ライブラリのGCCの実装です。
GLIBCXX_*
の違いは何ですか?これらもライブラリですか?
これらはバージョンシンボルであり、ライブラリを後方互換性を維持しながらAPIを変更できるようにするために使用されます。詳細は lddの出力で複数のGLIBCバージョンが何を意味するか? を参照してください。
問題は、これらのライブラリの異なるバージョンが異なるフォルダーにあるのはなぜですか?
/usr/lib64
のコピーは、ディストリビューションのバージョンです。 /usr/local/lib64
のコピーは他の何かによってインストールされました。
gcc
を実行するときに、古いライブラリの代わりに/usr/local/lib64
の6.0.20ライブラリを使用するようにするにはどうすればよいですか?
-L/usr/local/lib64
を使用してビルドし、LD_LIBRARY_PATH=/usr/local/lib64
を使用して実行することもできます(必要な場合)。