CentOS6 の libstdc++ を更新する

はじめに

 CentOS6 で比較的新しいソフトウェアを実行しようとすると、

/usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by <new software>)

のようなエラーが発生する事があります。
 これは CentOS6 にインストールされているライブラリが古く、ソフトウェアが要求するバージョンと合わないためです。
 今回、libstdc++ ライブラリを例にとって、CentOS6 に新しいバージョンのライブラリをインストールする方法を紹介します。

インストールされている libstdc++ の確認

 インストールされている libstdc++ に組み込まれているバージョンを確認します。

$ 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_FORCE_NEW
GLIBCXX_DEBUG_MESSAGE_LENGTH

 アプリケーションが要求するバージョン「GLIBCXX_3.4.15」が含まれていないことを確認できます。

gcc のビルド

 libstdc++ は gcc に含まれています。gcc をビルドして、libstdc++ を取り出して既存のものと置き換えます。

ビルドに必要なヘッダーのインストール

$ sudo yum install gmp-devel mpfr-devel libmpc-devel
$ sudo yum install glibc-devel.i686

ソースコードのダウンロード

 ミラーサイトからソースコードをダウンロードします。

$ mkdir -p ~/src
$ cd ~/src
$ curl -LO http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-4.8.4/gcc-4.8.4.tar.gz
$ tar fxz gcc-4.8.4.tar.gz
$ cd gcc-4.8.4

ビルド

$ ./configure
$ make

新しいライブラリのインストール

 現在のライブラリインストール状況を確認して、目的のライブラリ「libstdc++.so.6.0.19」のみコピーします。

$ ls -l /usr/lib64/libstd*

lrwxrwxrwx. 1 root root      19  5月 13 09:17 2015 libstdc++.so.6 -> libstdc++.so.6.0.13
-rwxr-xr-x. 1 root root  989840 10月 15 07:48 2014 libstdc++.so.6.0.13

$ sudo cp ${HOME}/src/gcc-4.8.4/x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.19 /usr/lib64

 既存のライブラリ (libstdc++.so.6.0.13) から、先ほどコピーした新しいライブラリに切り替えます。  古い方のライブラリはシンボリックリンクを含めて削除せず、いつでも切り戻せるよう移動するだけにします。

$ cd /usr/lib64
$ sudo mv libstdc++.so.6 libstdc++.so.6.bak
$ sudo ln -s libstdc++.so.6.0.19 libstdc++.so.6

$ ls -l /usr/lib64/libstd*

lrwxrwxrwx. 1 root root      19  5月 15 11:52 2015 libstdc++.so.6 -> libstdc++.so.6.0.19
-rwxr-xr-x. 1 root root  989840 10月 15 07:48 2014 libstdc++.so.6.0.13
-rwxr-xr-x. 1 root root 6469787  5月 15 11:51 2015 libstdc++.so.6.0.19
lrwxrwxrwx. 1 root root      19  5月 13 09:17 2015 libstdc++.so.6.bak -> libstdc++.so.6.0.13

 最後に、目的のバージョンの「GLIBCXX_3.4.15」が有効になっているか確認します。

$ 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_FORCE_NEW
GLIBCXX_DEBUG_MESSAGE_LENGTH

 無事に、バージョン 3.4.15 がリストされました。

CentOS6 の libstdc++ を更新する」への2件のフィードバック

  1. tacchang

    とある理由から、CentOS 6.7にChrome 37をインストールする必要があったのですが、「libstdc++.so.6(GLIBCXX_3.4.15)(64bit)」云々とエラーになって困っていました。とても助かりました。

    返信
  2. dareka

    参考になりました。ただ、手元でいろいろ試したところ、Chromeをyumでインストールすると /opt/google/chrome/lib/libstdc++.so.6 があり、それを適当なところにシンボリックリンクすると、同様の効果が得られました。

    返信

コメントを残す

メールアドレスが公開されることはありません。