gcc/c++/g++ の更新(複数の gcc/c++/g++ を共存)

概要

複数バージョンの gcc/c++/g++ を共存させる

Porg

gcc が、make uninstall に対応していないため、ソースのインストール/アンインストールを管理する、Porg を使用。

・インストール
    [root]# tar xvfz porg-0.10.tar.gz
    [root]# cd porg-0.10
    [root]# ./configure --disable-grop(Porg の GUI 版をインストールしない)
    [root]# make -j3
    [root]# make -j3 check
    [root]# make -j3 install
    [root]# porg -lp porg-0.10 make install  ・・・ Porg 自身も管理する
・ソフトウェアのインストール
    [root]# porg -lp 管理名 make install

      -l : ログ出力(/var/log/porg/管理名 に出力)
      -p : 管理名指定
・管理しているソフトウェア一覧
    [root]# porg -a -F -d -s

      -a : 全て
      -F : インストールされているファイル数
      -d : インストールされた日付
      -s : 占有しているサイズ
・管理しているソフトウェアのファイル一覧
    [root]# porg -fs 管理名
・ソフトウェアのアンインストール
    [root]# porg -r 管理名 

GLIBCXX バージョン

[root]# ls -l /usr/lib64/libstdc*

    lrwxrwxrwx. 1 root root    /usr/lib64/libstdc++.so.6 -> libstdc++.so.6.0.19
    -rwxr-xr-x. 1 root root    /usr/lib64/libstdc++.so.6.0.19

[root]# strings /usr/lib64/libstdc++.so.6 | grep -i glibcxx

    GLIBCXX_3.4
    GLIBCXX_3.4.1
        .
    GLIBCXX_3.4.19

gcc インストール

    [root]# yum install glibc glibc-devel
    [root]# yum install mpfr mpfr-devel

    [root]# tar xvfj gcc-4.4.7.tar.bz2
    [root]# cd gcc-4.4.7
    [root]# ./configure --program-suffix=-4.4 --disable-multilib(32bit または 64bit のみ)
    [root]# make -j3 -s(gcc-5.x.x ではエラー gcc-4.x.x で make する) 
    [root]# porg -lp gcc-4.4.7 make install

    [root]# tar xvfj gcc-4.9.4.tar.bz2
    [root]# cd gcc-4.9.4
    [root]# ./contrib/download_prerequisites    # 依存パッケージインストール
    [root]# ./configure --program-suffix=-4.9 --disable-multilib
    [root]# make -j3 -s 
    [root]# porg -lp gcc-4.9.4 make install

    [root]# tar xvfj gcc-5.4.0.tar.bz2
    [root]# cd gcc-5.4.0
    [root]# ./contrib/download_prerequisites
    [root]# ./configure --program-suffix=-5.4 --disable-multilib
    [root]# make -j3 -s 
    [root]# porg -lp gcc-5.4.0 make install

    [root]# tar xvfj gcc-6.1.0.tar.bz2
    [root]# cd gcc-6.1.0
    [root]# ./contrib/download_prerequisites
    [root]# ./configure --program-suffix=-6.1 --disable-multilib
    [root]# make -j3 -s
    [root]# porg -lp gcc-6.1.0 make install

    [root]# tar xvfj gcc-6.2.0.tar.bz2
    [root]# cd gcc-6.2.0
    [root]# ./contrib/download_prerequisites
    [root]# ./configure --program-suffix=-6.2 --disable-multilib
    [root]# make -j3 -s
    [root]# porg -lp gcc-6.2.0 make install

    [root]# gcc --version       # gcc (GCC) 4.8.5
    [root]# gcc-4.4 --version   # gcc-4.4 (GCC) 4.4.7
    [root]# gcc-4.9 --version   # gcc-4.9 (GCC) 4.9.4
    [root]# gcc-5.4 --version   # gcc-5.4 (GCC) 5.4.0
    [root]# gcc-6.1 --version   # gcc-6.1 (GCC) 6.1.0
    [root]# gcc-6.2 --version   # gcc-6.2 (GCC) 6.2.0

    [root]# c++ --version       # c++ (GCC) 4.8.5
    [root]# c++-4.4 --version   # c++-4.4 (GCC) 4.4.7
    [root]# c++-4.9 --version   # c++-4.9 (GCC) 4.9.4
    [root]# c++-5.4 --version   # c++-5.4 (GCC) 5.4.0
    [root]# c++-6.1 --version   # c++-6.1 (GCC) 6.1.0
    [root]# c++-6.2 --version   # c++-6.2 (GCC) 6.2.0

    [root]# g++ --version       # g++ (GCC) 4.8.5
    [root]# g++-4.4 --version   # g++-4.4 (GCC) 4.4.7
    [root]# g++-4.9 --version   # g++-4.9 (GCC) 4.9.4
    [root]# g++-5.4 --version   # g++-5.4 (GCC) 5.4.0
    [root]# g++-6.1 --version   # g++-6.1 (GCC) 6.1.0
    [root]# g++-6.2 --version   # g++-6.2 (GCC) 6.2.0

ライブラリにパスを通す

[root]# ldconfig -v | grep libstdc

    libstdc++.so.6 -> libstdc++.so.6.0.19

[root]# updatedb

[root]# locate libstdc++.so.6

    /usr/lib64/libstdc++.so.6
    /usr/lib64/libstdc++.so.6.0.13
    /usr/lib64/libstdc++.so.6.0.19
    /usr/local/lib64/libstdc++.so.6
    /usr/local/lib64/libstdc++.so.6.0.20
    /usr/local/lib64/libstdc++.so.6.0.20-gdb.py
    /usr/local/lib64/libstdc++.so.6.0.21
    /usr/local/lib64/libstdc++.so.6.0.21-gdb.py
    /usr/local/lib64/libstdc++.so.6.0.22
    /usr/local/lib64/libstdc++.so.6.0.22-gdb.py

[root]# vim /etc/ld.so.conf.d/local.conf

    /usr/local/lib64

[root]# ldconfig

[root]# ldconfig -v | grep libstdc

    libstdc++.so.6 -> libstdc++.so.6.0.22
    libstdc++.so.6 -> libstdc++.so.6.0.21
    libstdc++.so.6 -> libstdc++.so.6.0.19
   /usr/local/lib64 に OS 標準より古いバージョン(libstdc++.so.6.0.13)のみだと
  /usr/local/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found
  が出現して、firefox が起動しない、cmake エラーなどの不具合が起こる。

GLIBCXX バージョン

[root]# ls -l /usr/local/lib64/libstdc*

    lrwxrwxrwx 1 root root    /usr/local/lib64/libstdc++.so.6 -> libstdc++.so.6.0.22
    -rwxr-xr-x 1 root root    /usr/local/lib64/libstdc++.so.6.0.20
    -rwxr-xr-x 1 root root    /usr/local/lib64/libstdc++.so.6.0.21
    -rwxr-xr-x 1 root root    /usr/local/lib64/libstdc++.so.6.0.22

[root]# strings /usr/local/lib64/libstdc++.so.6 | grep -i glibcxx

    GLIBCXX_3.4
    GLIBCXX_3.4.1
        .
    GLIBCXX_3.4.22

共存環境でデフォルトのバージョンを切り替える

alternatives にて、バージョンを変更

・gcc
    # デフォルトの gcc を移動
    [root]# mv -v /usr/bin/gcc /usr/bin/gcc-4.8
    # リストに追加
    [root]# alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 48(優先度)
    [root]# alternatives --install /usr/bin/gcc gcc /usr/local/bin/gcc-4.4 44(優先度)
    [root]# alternatives --install /usr/bin/gcc gcc /usr/local/bin/gcc-4.9 49(優先度)
    [root]# alternatives --install /usr/bin/gcc gcc /usr/local/bin/gcc-5.4 54(優先度)
    [root]# alternatives --install /usr/bin/gcc gcc /usr/local/bin/gcc-6.1 61(優先度)
    [root]# alternatives --install /usr/bin/gcc gcc /usr/local/bin/gcc-6.2 62(優先度)
    [root]# alternatives --remove gcc /usr/local/bin/gcc-4.9      # 削除する場合
    [root]# alternatives --config gcc                             # 手動選択
    [root]# alternatives --auto gcc                               # 自動選択
    [root]# alternatives --display gcc                            # 確認
    [root]# gcc --version
・c++
    # デフォルトの c++ を移動
    [root]# mv -v /usr/bin/c++ /usr/bin/c++-4.8
    # リストに追加
    [root]# alternatives --install /usr/bin/c++ c++ /usr/bin/c++-4.8 48(優先度)
    [root]# alternatives --install /usr/bin/c++ c++ /usr/local/bin/c++-4.4 44(優先度)
    [root]# alternatives --install /usr/bin/c++ c++ /usr/local/bin/c++-4.9 49(優先度)
    [root]# alternatives --install /usr/bin/c++ c++ /usr/local/bin/c++-5.4 54(優先度)
    [root]# alternatives --install /usr/bin/c++ c++ /usr/local/bin/c++-6.1 61(優先度)
    [root]# alternatives --install /usr/bin/c++ c++ /usr/local/bin/c++-6.2 62(優先度)
    [root]# alternatives --remove c++ /usr/local/bin/c++-4.9      # 削除する場合
    [root]# alternatives --config c++                             # 手動選択
    [root]# alternatives --auto c++                               # 自動選択
    [root]# alternatives --display c++                            # 確認 
    [root]# c++ --version
・g++
    # デフォルトの g++ を移動
    [root]# mv -v /usr/bin/g++ /usr/bin/g++-4.8
    # リストに追加
    [root]# alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 48(優先度)
    [root]# alternatives --install /usr/bin/g++ g++ /usr/local/bin/g++-4.4 44(優先度)
    [root]# alternatives --install /usr/bin/g++ g++ /usr/local/bin/g++-4.9 49(優先度)
    [root]# alternatives --install /usr/bin/g++ g++ /usr/local/bin/g++-5.4 54(優先度)
    [root]# alternatives --install /usr/bin/g++ g++ /usr/local/bin/g++-6.1 61(優先度)
    [root]# alternatives --install /usr/bin/g++ g++ /usr/local/bin/g++-6.2 62(優先度)
    [root]# alternatives --remove g++ /usr/local/bin/g++-4.9      # 削除する場合
    [root]# alternatives --config g++                             # 手動選択
    [root]# alternatives --auto g++                               # 自動選択
    [root]# alternatives --display g++                            # 確認 
    [root]# g++ --version

パッケージ管理システムの更新対象から除外

・yum
    [root]# vim /etc/yum.conf

      [main]
      exclude=gcc*
・dnf
    [root]# vim /etc/dnf/dnf.conf

      [main]
      exclude=gcc*