gcc-9.1.0をCentOS6にソースインストール

覚書です。
ところどころ省いています。
実践環境で使う場合はご注意ください。

※本記事より新しい記事があります。
gcc-10.1.0をCentOS6にソースインストール

目的

cmake-3.14.5 をインストールしようとしたところ configure で次のエラーが発生しました。

---------------------------------------------
CMake 3.14.5, Copyright 2000-2019 Kitware, Inc. and Contributors
Found GNU toolchain
C compiler on this system is: gcc
---------------------------------------------
Error when bootstrapping CMake:
Cannot find a C++ compiler that supports both C++11 and the specified C++ flags.
Please specify one using environment variable CXX.
The C++ flags are "".
They can be changed using the environment variable CXXFLAGS.
See cmake_bootstrap.log for compilers attempted.
---------------------------------------------

C++のコンパイラが古いので、C++11に対応したものが必要とのこと。

特徴

  • ソースコードからのインストール
  • 複数バージョンの共存

特定バージョンでの開発や動作確認など開発環境での用途を目的としています。

環境

実施日2019-6-21
サーバさくらのVPS 2G
OSCentOS 6.10
cat /etc/redhat-release
CentOS release 6.10 (Final)
rpm -qa | grep centos-release
centos-release-scl-7-4.el6.centos.noarch
centos-release-6-10.el6.centos.12.3.x86_64
centos-release-scl-rh-2-4.el6.centos.noarch

事前準備

gcc の確認

gcc --version
gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-23)

※これは yum で入れたものです。
このバージョンは古くてCMakeには使えませんが、本記事でインストールする gcc のコンパイルに必要です。
インストールしていない場合は
# yum install gcc

gcc-c++ の確認

g++ --version
g++ (GCC) 4.4.7 20120313 (Red Hat 4.4.7-23)

※これは yum で入れたものです。
このバージョンは古くてCMakeには使えませんが、本記事でインストールする gcc のコンパイルに必要です。
インストールしていない場合は
# yum install gcc-c++

gcc-9.1.0

公式サイトからダウンロードして、/tmp  にアップロード

GCCの公式サイトに行くとダウンロードページへのリンクがあります。

トップページ右側の青いところ「Download」の「Mirrors」をクリック。
Japan: ftp.tsukuba.wide.ad.jp, ・・・ のところをクリック。
releases/ をクリック。
gcc-9.1.0/ をクリック。

「gcc-9.1.0.tar.gz」をクリックしてダウンロードし、次の場所にアップロードします。

/tmp/gcc-9.1.0.tar.gz

※ダウンロードしたファイルは100MBちょっとなので、異常に巨大なファイルをダウンロードしていたら壊れている可能性大です。Japan以外を試してみます。

インストール

ls -la /usr/local/src
ls -la /usr/local/lib

mkdir /usr/local/src/gcc-9.1.0

cp /tmp/gcc-9.1.0.tar.gz /usr/local/src/gcc-9.1.0/gcc-9.1.0.tar.gz

cd /usr/local/src/gcc-9.1.0

tar xvzf gcc-9.1.0.tar.gz

cd gcc-9.1.0

./contrib/download_prerequisites

./configure --enable-languages=c,c++ --prefix=/usr/local/lib/gcc-9.1.0 --disable-bootstrap --disable-multilib

make

make install

/usr/local/lib/gcc-9.1.0/bin/gcc -v
/usr/local/lib/gcc-9.1.0/bin/g++ -v

エラー対応

./contrib/download_prerequisites
で次のようなエラーが出たときはbzip2をインストールします。

tar (child): lbzip2: exec
yum install bzip2

libstdc++ の入れ替え

インストール状況を確認

ls -la /usr/local/lib/gcc-9.1.0/lib64/libstd*
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

libstdc++.so.6.0.26 をコピー

cp /usr/local/lib/gcc-9.1.0/lib64/libstdc++.so.6.0.26 /usr/lib64

確認

ls -la /usr/lib64/libstd*
lrwxrwxrwx 1 root root       19  7月 29 15:03 2018 /usr/lib64/libstdc++.so.6 -> libstdc++.so.6.0.13
-rwxr-xr-x 1 root root   989840  6月 19 21:11 2018 /usr/lib64/libstdc++.so.6.0.13
-rwxr-xr-x 1 root root 17825825  6月 21 16:36 2019 /usr/lib64/libstdc++.so.6.0.26

入れ替え

cd /usr/lib64
mv libstdc++.so.6 libstdc++.so.6.bak
ln -s libstdc++.so.6.0.26 libstdc++.so.6

確認

ls -la /usr/lib64/libstd*
lrwxrwxrwx 1 root root       19  6月 21 16:41 2019 /usr/lib64/libstdc++.so.6 -> libstdc++.so.6.0.26
-rwxr-xr-x 1 root root   989840  6月 19 21:11 2018 /usr/lib64/libstdc++.so.6.0.13
-rwxr-xr-x 1 root root 17825825  6月 21 16:36 2019 /usr/lib64/libstdc++.so.6.0.26
lrwxrwxrwx 1 root root       19  7月 29 15:03 2018 /usr/lib64/libstdc++.so.6.bak -> libstdc++.so.6.0.13

確認

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_3.4.20
GLIBCXX_3.4.21
GLIBCXX_3.4.22
GLIBCXX_3.4.23
GLIBCXX_3.4.24
GLIBCXX_3.4.25
GLIBCXX_3.4.26
GLIBCXX_FORCE_NEW
GLIBCXX_DEBUG_MESSAGE_LENGTH