「インストール - GCC」の版間の差分

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動
16行目: 16行目:
==== パッケージ管理システムの使用 ====
==== パッケージ管理システムの使用 ====
  # CentOS
  # CentOS
  sudo yum install gmp-devel mpfr-devel libmpc-devel
  sudo yum install gmp-devel mpfr-devel libmpc-devel isl-devel  
   
   
  # SUSE
  # SUSE
  sudo zypper install gmp-devel mpfr-devel mpc-devel
  sudo zypper install gmp-devel mpfr-devel mpc-devel isl-devel
<br>
<br>
==== GCCのモジュールの使用 ====
==== GCCのモジュールの使用 ====
[https://gcc.gnu.org GCCの公式Webサイト]にアクセスして、GCCのソースコードをダウンロードして解凍する。<br>
[https://gcc.gnu.org GCCの公式Webサイト]にアクセスして、GCCのソースコードをダウンロードして解凍する。<br>

2021年3月30日 (火) 16:34時点における版

概要

CentOSやSUSEのパッケージ管理システムで提供されているGCCのバージョンは古い可能性がある。
最新のGCCでは、C++11からC++17を完全にサポートしており、また、C++20を部分的にサポートしている。
また、最新のGCCでは、C11およびC++14のサポートがデフォルトで有効になっている。(-std=c11または-std=c++14を追加する必要はない)


依存関係のライブラリのインストール

まず、システムが最新であることを確認する。

# CentOS
sudo yum update

# SUSE
sudo zypper update


依存関係のライブラリを、以下に示す2種類のいずれかの方法でインストールする。

パッケージ管理システムの使用

# CentOS
sudo yum install gmp-devel mpfr-devel libmpc-devel isl-devel 

# SUSE
sudo zypper install gmp-devel mpfr-devel mpc-devel isl-devel


GCCのモジュールの使用

GCCの公式Webサイトにアクセスして、GCCのソースコードをダウンロードして解凍する。
または、以下のコマンドを実行してダウンロードする。

wget http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-10.1.0/gcc-10.1.0.tar.xz
wget http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-10.1.0/sha512.sum
tar zxvf gcc-10.1.0.tar.gz -o src


次に、解凍したGCCのディレクトリに移動して、以下のコマンドを実行すると、依存関係のライブラリがダウンロードされる。

./contrib/download_prerequisites


ダウンロードされた依存関係のライブラリを解凍する。

tar -xvf gmp-6.1.0.tar.bz2
tar -xvf mpfr-3.1.4.tar.bz2 
tar -xvf mpc-1.0.3.tar.gz 
tar -xvf isl-0.18.tar.bz2 


これらのライブラリを全てインストールする。

  • gmpのインストール
./gmp-6.1.0/configure --prefix=$HOME/InstallSoftware/GCC/GCC-10_1_0 --enable-cxx
make -j 8
make check
make install


  • mpfrのインストール
./mpfr-3.1.4/configure --prefix=$HOME/InstallSoftware/GCC/GCC-10_1_0 --with-gmp=$HOME/InstallSoftware/GCC/GCC-10_1_0
make -s -j 8
make -s check
make install


  • mpcのインストール
./mpc-1.0.3/configure --prefix=$HOME/InstallSoftware/GCC/GCC-10_1_0 --with-gmp=$HOME/InstallSoftware/GCC/GCC-10_1_0 --with-mpfr=$HOME/InstallSoftware/GCC/GCC-10_1_0
make -s -j 8
make check -s -j 8
make install


  • islのインストール
./isl-0.18/configure --prefix=$HOME/InstallSoftware/GCC/GCC-10_1_0 --with-gmp-prefix=$HOME/InstallSoftware/GCC/GCC-10_1_0
make -j 8
make check
make install



GCCのインストール

GCCの公式Webサイトにアクセスして、GCCのソースコードをダウンロードして解凍する。
または、以下のコマンドを実行してダウンロードする。

wget http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-10.1.0/gcc-10.1.0.tar.xz
wget http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-10.1.0/sha512.sum
tar zxvf gcc-10.1.0.tar.gz -o src


sha512.sumファイルを使用して、ダウンロードしたgcc-10.1.0.tar.xzファイルのチェックを行う。
sha512sum: gcc-8.2.0.tar.gz: No such file or directorygcc-8.2.0.tar.xz: FAILED open or readというメッセージが表示されるが、
gcc-10.1.0.tar.gzファイルをダウンロードしていないため表示されているだけなので、特に問題ない。

sha512sum --check sha512.sum


ここでは、ホームディレクトリにインストールを行う。

mkdir -p ~/InstallSoftware/GCC/gcc-10_1_0 && cd ~/InstallSoftware/GCC


以下のコマンドを実行して、GCCをビルドおよびインストールする。
オプションの説明を記載する。

  • enable-languages=c,c++,fortran
    C、C++、FORTRANのコンパイラをビルド対象とする。
  • disable-bootstrap
    3-stage bootstrap buildの無効化。
  • disable-multilib
    64bit専用コンパイラとする(OSが64bitの場合は指定)
cd gcc-10.1.0
mkdir build && cd build


# パッケージ管理システムで依存関係のライブラリをインストールしている場合
../configure -v --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu --prefix=$HOME/InstallSoftware/GCC/gcc-10_1_0 \
--enable-checking=release --enable-languages=c,c++,fortran --disable-multilib --disable-bootstrap --program-suffix=-10.1

make -j 8

make install-strip

# 手動で依存関係のライブラリをインストールしている場合
../configure --disable-multilib --enable-languages=c,c++,fortran --prefix=$HOME/InstallSoftware/GCC/GCC-10_1_0 \
--with-gmp=$HOME/InstallSoftware/GCC/GCC-10_1_0 --with-mpc=$HOME/InstallSoftware/GCC/GCC-10_1_0 \
--with-mpfr=$HOME/InstallSoftware/GCC/GCC-10_1_0 --with-isl=$HOME/InstallSoftware/GCC/GCC-10_1_0

unset LIBRARY_PATH CPATH C_INCLUDE_PATH PKG_CONFIG_PATH CPLUS_INCLUDE_PATH INCLUDE

LD_LIBRARY_PATH=$HOME/InstallSoftware/GCC/GCC-10_1_0/lib make -j 8

make install


インストールしたGCCへ環境変数のパスを通す。

vi ~/.profile

# .profileファイル
export export PATH=$HOME/InstallSoftware/GCC/gcc-10_1_0/bin:$PATH
export LD_LIBRARY_PATH=$HOME/InstallSoftware/GCC/gcc-10.1.0/lib64:$LD_LIBRARY_PATH


最後に、PCを再起動する。


共有ライブラリの参照設定

GCCをソースコードからインストールした場合、共有ライブラリが/<GCCのインストールディレクトリ>/lib64に作成されるが、
環境変数のパスが通っていないため、Linuxから参照されない。

そのため、以下のいずれかの方法で環境変数のパスを通す必要がある。

  • /etc/ld.so.confファイルに記述する。(システム全体)
  • ~/.profileファイルまたは~/.bashrcファイル等に、LD_LIBRARY_PATHを記述する。(ユーザごとに設定が必要)


ld.so.confファイルに設定する

/etc/ld.so.confファイルに/<GCCのインストールディレクトリ/lib64を追記することで、Linuxがライブラリを認識する。
以下のコマンドを実行して、設定を追記する。

sudo vi /etc/ld.so.conf

# /etc/ld.so.confファイル
/<GCCのインストールディレクトリ/lib64


上記の設定を反映させるため、ldconfigコマンドを実行する。

ldconfig -v


ldconfigコマンドを実行した時に表示される情報から、
以下のように、/<GCCのインストールディレクトリ/lib64ディレクトリが読み込まれていることを確認する。

/<GCCのインストールディレクトリ>/lib64:
ldconfig: /<GCCのインストールディレクトリ>/lib64/libstdc++.so.6.0.25-gdb.py is not an ELF file - it has the wrong magic bytes at the start.

       libatomic.so.1 -> libatomic.so.1.2.0
       libitm.so.1 -> libitm.so.1.0.0
       libgomp.so.1 -> libgomp.so.1.0.0
       libquadmath.so.0 -> libquadmath.so.0.0.0
       libssp.so.0 -> libssp.so.0.0.0
       libmpxwrappers.so.2 -> libmpxwrappers.so.2.0.1


ldconfigコマンドを実行した結果、もし、以下のようなメッセージが表示された場合の対処方法を記載する。

ldconfig: /<GCCのインストールディレクトリ>/lib64/libstdc++.so.6.0.25-gdb.py is not an ELF file - it has the wrong magic bytes at the start.


これは、libstdc++.so.6.0.25-gdb.pyは、pythonのスクリプトであるが、これを共有ライブラリとして認識していることが原因である。

file /<GCCのインストールディレクトリ>/lib64/libstdc++.so.6.0.25-gdb.py

/<GCCのインストールディレクトリ>/lib64/libstdc++.so.6.0.25-gdb.py: Python script, ASCII text executable


対処方法としては、該当ファイルの名前を変更して、共有ライブラリと認識されないようする。

mv /<GCCのインストールディレクトリ>/lib64/libstdc++.so.6.0.25-gdb.py  /<GCCのインストールディレクトリ>/lib64/libstdc++.so.6.0.25-gdb.py_org


再度、ldconfigコマンドを実行する。

ldconfig -v


また、CentOS 7の場合、/etc/ld.so.confファイルにinclude ld.so.conf.d/*.confと設定されているが、
これは、ld.so.conf.dディレクトリ内のconf拡張子をもつファイルの内容を読み込むという設定である。

ld.so.conf.dディレクトリ内に/<GCCのインストールディレクトリ>/lib64と記述したconfファイルを作成することにより、
Linuxに共有ライブラリのパスを認識させることができる。

ここでは、/etc/ld.so.conf.d/UserAdd-lib64.confファイルを作成する。

sudo vi /etc/ld.so.conf.d/UserAdd-lib64.conf

# UserAdd-lib64.confファイル
/<GCCのインストールディレクトリ>/lib64


上記の設定を反映させるため、ldconfigコマンドを実行する。

ldconfig -v


LD_LIBRARY_PATHに設定する

この方法は、ユーザごとに設定する必要がある。
~/.profileファイルまたは~/.bashrcファイル等に、LD_LIBRARY_PATHの設定を追加することで、ユーザがログインする際に設定が読み込まれる。

vi ~/.profile

# ~/.profileファイル
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/<GCCのインストールディレクトリ>/lib64


上記の設定を反映させるため、PCを再起動または再ログインする。


libstdc++の入れ替え

この操作を行うと、システムが不安定になる可能性があるため、必要な時にのみこれを行う。

現在のlibstdc++の対応関係を確認する。

strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX


インストールしたGCCのlibstdc++.so.<バージョン名>をコピーする。

sudo cp /<GCCのインストールディレクトリ>/lib64/libstdc++.so.6.0.28 /usr/lib64


/usr/lib64ディレクトリにあるlibstdc++.so.6ファイルのバージョンを確認する。

ls -ahlF /usr/lib64/libstd*


libstdc++.so.6ファイルを入れ替える。

sudo mv /usr/lib64/libstdc++.so.6 /usr/lib64/libstdc++.so.6_org
sudo ln -s /usr/lib64/libstdc++.so.<バージョン名> /usr/lib64/libstdc++.so.6


正常にコピーできたか確認する。

ls -ahlF /usr/lib64/libstd*


入れ替えたlibstdc++の対応関係を確認する。

strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX



C++14 / C++17のサンプルコード

C++14では、ラムダ式のパラメータのタイプにautoが使用できる。

 // sample.cpp
 
 #include <iostream>
  
 int main()
 {
    std::cout << [](auto a, auto b) { return a + b; } (5, 6) << std::endl;
    std::cout << [](auto a, auto b) { return a + b; } (5.23, 6.45) << std::endl;
    return 0;
 }


# 実行
g++-10.1 -Wall -pedantic sample.cpp -o sample
./sample

# 出力
11
11.68


このページの冒頭で述べたように、GCC 10.1は、C++17を完全にサポートしている。
以下の例では、static_assertへのC++17変更の使用例をテストしている。

 // sample.cpp
 
 #include <type_traits>
 #include <iostream>
  
 struct A
 {
    int foo;
 };
 
 struct B
 {
    int foo = 0;
 };
  
 template <typename T>
 void print(const T& a)
 {
    static_assert(std::is_pod<T>::value);
    std::cout << a.foo << '\n';
 }
  
 int main()
 {
    A x{1};
    B y{2};
    B z;
 
    print<A>(x);
    print<B>(y);
    print<B>(z);
 
    return 0;
 }


コンパイルを行うには、-std=c++17オプションを付与する。
また、上記のコードの17行目と24行目でトリガーされたコンパイルエラーが表示される。

# 実行
g++-10.1 -std=c++17 -Wall -pedantic sample.cpp -o sample

# 出力
sample.cpp: In instantiation of ‘void print(const T&) [with T = B]’:
sample.cpp:24:13:   required from here
sample.cpp:14:33: error: static assertion failed
    17 |   static_assert(std::is_pod<T>::value);


もし、C++11の構文の詳細に興味がある場合は、Bjarne StroustrupによるC++プログラミング言語を読むことを推奨する。