インストール - GCC
概要
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 patterns-base-basesystem patterns-devel-base-devel_basis patterns-devel-C-C++-devel_C_C++ \ gcc gcc-c++ gawk ncurses-devel make tar pkg-config m4 gperf bison flex expect expect-devel \ 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-<バージョン>/gcc-<バージョン>.tar.xz wget http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-<バージョン>/sha512.sum tar xf gcc-<バージョン>.tar.xz
sha512.sumファイルを使用して、ダウンロードしたファイルのチェックを行う。
sha512sum: gcc-<バージョン>.tar.gz: No such file or directory
というメッセージが表示されるが、
gcc-<バージョン>.tar.gzファイルをダウンロードしていないため表示されているだけなので、特に問題ない。
sha512sum --check sha512.sum
GCC 7.1をインストールする場合、/<GCC 7.1のソースディレクトリ>/libgcc/config/i386/linux-unwind.hファイルを、以下に示すように修正する必要がある。
# /<GCC 7.1のソースディレクトリ>/libgcc/config/i386/linux-unwind.hファイルの61行目 # 修正前 struct ucontext *uc_ = context->cfa; # 修正後 struct ucontext_t *uc_ = context->cfa;
GCCをビルドおよびインストールする。
オプションの説明を記載する。
- enable-languages=c,c++,fortran
- C、C++、FORTRANのコンパイラをビルド対象とする。
- disable-bootstrap
- ただし、クロスコンパイラ向けでは使用できないことに注意すること。
- 3-stage bootstrap buildの無効化。
- disable-multilib
- 64bit専用コンパイラとする。(ただし、
-m32
オプションが使用できなくなる)
- 64bit専用コンパイラとする。(ただし、
cd gcc-<バージョン> mkdir build && cd build
# GCC 7.5以降かつパッケージ管理システムで依存関係のライブラリをインストールしている場合 ../configure -v --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu \ --prefix=<GCCのインストールディレクトリ> --program-suffix="_X_X" \ --enable-languages=c,c++,fortran --disable-bootstrap make -j $(nproc) make install-strip # GCC 7.5以降かつ手動で依存関係のライブラリをインストールしている場合 ../configure -v --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu \ --prefix=<GCCのインストールディレクトリ> --program-suffix="_X_X" \ --enable-checking=release --enable-languages=c,c++,fortran --disable-bootstrap \ --with-gmp=<GMP, MPC MPFR, ISLのインストールディレクトリ> --with-mpc=<GMP, MPC MPFR, ISLのインストールディレクトリ> \ --with-mpfr=<GMP, MPC MPFR, ISLのインストールディレクトリ> --with-isl=<GMP, MPC MPFR, ISLのインストールディレクトリ> unset LIBRARY_PATH CPATH C_INCLUDE_PATH PKG_CONFIG_PATH CPLUS_INCLUDE_PATH INCLUDE LD_LIBRARY_PATH=/<GMP, MPC MPFR, ISLのインストールディレクトリ>/lib64 make -j $(nproc) make install # GCC 6.5以前かつパッケージ管理システムで依存関係のライブラリをインストールしている場合 ../configure -v --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu \ --prefix=<GCCのインストールディレクトリ> --program-suffix="_X_X" \ --enable-checking=release --enable-languages=c,c++,fortran --disable-bootstrap \ --disable-libsanitizer --disable-libcilkrts make -j $(nproc) make install-strip
インストールしたGCCへ環境変数のパスを通す。
vi ~/.profile # .profileファイル export export PATH="/<GCCのインストールディレクトリ>/bin:$PATH" export LD_LIBRARY_PATH="/<GCCのインストールディレクトリ>/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
クロスコンパイラ向けGCCツールチェーンのインストール
クロスコンパイラ向けGCCツールチェーンとは
クロスコンパイラ向けGCCツールチェインは、C/C++、アセンブリ言語のためのオープンソースのツール群である。
これは、各アーキテクチャのプロセッサを対象として実装している。
AArch64 (システムルートあり)
まず、GNUの公式Webサイトから、Binutilsをダウンロードする。
ダウンロードしたファイルを解凍する。
tar xf binutils-<バージョン>.tar.xz cd binutils-<バージョン>
ビルドディレクトリを作成する。
mkdir build && cd build
クロスコンパイラ向けBinutilsのビルドおよびインストールする。
インストールディレクトリは、クロスコンパイラ向けGCCのインストールディレクトリと同じディレクトリであることに注意する。
../configure --prefix=<クロスコンパイラ向けGCCのインストールディレクトリ> \ --build=x86_64-pc-linux-gnu --host=x86_64-pc-linux-gnu --target=aarch64-unknown-linux-gnu \ --disable-gdb --disable-nls --disable-multilib --disable-werror \ --enable-gold --enable-lto --enable-plugins --enable-relro \ --with-sysroot=<ターゲットのシステムルートディレクトリ> \ CFLAGS="-g0 -O3 -fstack-protector-strong" \ CXXFLAGS="-g0 -O3 -fstack-protector-strong" make -j $(nproc) make install
次に、GCCの公式Webサイトにアクセスして、GCCのソースコードをダウンロードして解凍する。
または、以下のコマンドを実行してダウンロードする。
wget http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-<バージョン>/gcc-<バージョン>.tar.xz tar xf gcc-<バージョン>.tar.xz cd gcc-<バージョン>
クロスコンパイラ向けGCCをビルドおよびインストールする。
クロスコンパイラ向けGCCをビルドする場合、ネイティブ向けGCCとバージョンを合わせた方がよい。
export PATH="/<上記でインストールしたBinutilsのインストールディレクトリ>/bin:$PATH" && \ CC=<ネイティブ向けGCCのパス> CXX=<ネイティブ向けG++のパス> \ ../configure -v --prefix=<クロスコンパイラ向けGCCのインストールディレクトリ> \ --build=x86_64-pc-linux-gnu --host=x86_64-pc-linux-gnu --target=aarch64-unknown-linux-gnu \ --enable-languages=c,c++ --disable-bootstrap --disable-multilib --disable-nls \ --with-sysroot=<ターゲットのシステムルートディレクトリ> \ CFLAGS="-g0 -O3 -fstack-protector-strong" \ CXXFLAGS="-g0 -O3 -fstack-protector-strong" make -j $(nproc) make install-strip
H8 (システムルート無し)
まず、GNUの公式Webサイトから、Binutilsをダウンロードする。
ダウンロードしたファイルを解凍する。
tar xf binutils-<バージョン>.tar.xz cd binutils-<バージョン>
クロスコンパイラ向けBinutilsのビルドおよびインストールする。
インストールディレクトリは、クロスコンパイラ向けGCCのインストールディレクトリと同じディレクトリであることに注意する。
mkdir build && cd build ../configure --prefix=<クロスコンパイラ向けGCCのインストールディレクトリ> \ --build=x86_64-pc-linux-gnu --host=x86_64-pc-linux-gnu --target=h8300-elf \ --disable-gdb --disable-nls --disable-multilib --disable-werror \ --enable-lto make -j $(nproc) make install
次に、GCCの公式Webサイトにアクセスして、GCCのソースコードをダウンロードする。
ダウンロードしたファイルを解凍する。
tar xf gcc-<バージョン>.tar.xz cd gcc-<バージョン>
さらに、NewLibの公式Webサイト、または、NewLibのGithubにアクセスして、NewLibのソースコードをダウンロードする。
もし、NewLibの公式Webサイトからファイルをダウンロードできない場合は、wget
コマンド等を使用してダウンロードする。
wget ftp://sourceware.org/pub/newlib/newlib-<バージョン>.tar.gz
ダウンロードしたファイルを解凍する。
tar xf newlib-<バージョン>.tar.gz
クロスコンパイラ向けGCC(1度目は、gccファイルのみ)をビルドおよびインストールする。
クロスコンパイラ向けGCCをビルドする場合、ネイティブ向けGCCとバージョンを合わせた方がよい。
GCC ビルド ステージ 1 cd <GCCのソースコードがあるディレクトリ> mkdir build && cd build export PATH="/<上記でインストールしたBinutilsのインストールディレクトリ>/bin:$PATH" && \ CC=<ネイティブ向けGCCのパス> CXX=<ネイティブ向けG++のパス> \ ../configure --prefix=<クロスコンパイラ向けGCCのインストールディレクトリ> \ --build=x86_64-pc-linux-gnu --host=x86_64-pc-linux-gnu --target=h8300-elf \ --enable-languages=c,c++ \ --disable-bootstrap --disable-nls --disable-shared --disable-libstdcxx-pch --enable-lto --enable-gold \ --with-newlib \ --with-headers=/<上記でダウンロードしたNewLibのディレクトリ>/newlib/libc/include make -j $(nproc) LANGUAGES="c c++" all-gcc make -j $(nproc) LANGUAGES="c c++" install-gcc make install-strip
次に、NewLibをビルドおよびインストールする。
mkdir build && cd build export PATH="/<上記でインストールしたBinutilsのインストールディレクトリ>/bin:$PATH" && \ CC=<ネイティブ向けGCCのパス> CXX=<ネイティブ向けG++のパス> \ ../configure --prefix=<クロスコンパイラ向けGCCのインストールディレクトリ> \ --build=x86_64-pc-linux-gnu --host=x86_64-pc-linux-gnu --target=h8300-elf make -j $(nproc) make install
GCC ARMツールチェーンの使用方法
GCC ARMツールチェーンとは
Cortex-A向けGNUツールチェインは、C/C++、アセンブリ言語のためのオープンソースのツール群である。
これは、Cortex-Aファミリのプロセッサを対象としており、Arm Aプロファイルアーキテクチャを実装している。
このツールチェーンにはGCCが含まれており、WindowsおよびLinux向けに無償で提供されている。
GCC ARMツールチェーンのダウンロード
Cortex-Aファミリ
ARMの公式Webサイトから、ユーザの環境に合うバージョンをダウンロードする。
GCC ARMを解凍して、適切なディレクトリに配置する。
Raspberry Pi
Raspberry Pi向けにクロスコンパイルする場合は、下表を参考にして、ユーザの環境に合ったGCC ARMツールチェーンをダウンロードする。
https://sourceforge.net/projects/raspberry-pi-cross-compilers/files/Raspberry%20Pi%20GCC%20Cross-Compiler%20Toolchains/
Raspberry Piの種類 | Raspbian Stretch(32-bit) | Raspbian Buster(32-bit) | Raspbian Bullseye(32-bit) |
---|---|---|---|
Raspberry Pi Zero/W/WH Raspberry Pi 1 Model A / B / A+ / B+ |
6.3.0 9.3.0 10.2.0 |
8.3.0 9.3.0 10.2.0 |
10.2.0 10.3.0 |
Raspberry Pi 2 Model A / B Raspberry Pi 3 Model A / B |
6.3.0 9.3.0 10.2.0 |
8.3.0 9.3.0 10.2.0 |
10.2.0 10.3.0 |
Raspberry Pi 3 Model A+ / B+ Raspberry Pi 4 Model A+ / B+ Raspberry Pi Compute 3 / 3lite / 3+ |
6.3.0 8.3.0 10.2.0 |
8.3.0 9.3.0 10.2.0 |
10.2.0 10.3.0 |
上表は、Raspbian OS 32bit向けのGCC ARMツールチェインであるが、Raspbian OS 64bit向けのGCC ARMツールチェインが必要な場合は、以下に示すURLにアクセスする。
https://sourceforge.net/projects/raspberry-pi-cross-compilers/files/Bonus%20Raspberry%20Pi%20GCC%2064-Bit%20Toolchains/Raspberry%20Pi%20GCC%2064-Bit%20Cross-Compiler%20Toolchains/
また、Raspberry Pi向けには、Linaro社が提供しているGCC ARMツールチェインを使用することもできる。
https://releases.linaro.org/components/toolchain/binaries/latest-7/arm-linux-gnueabihf
- Windows x86 / Linux x86の場合
- gcc-linaro-7.5.0-2019.12-i686_arm-linux-gnueabihf.tar.xz
- Linux x64の場合
- gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz
GCC ARMツールチェーンを使用したコンパイル
Cortex-Aファミリ
以下の例では、ARMの公式WebサイトからダウンロードしたGCC ARMツールチェーンを使用して、
任意のソフトウェアをCortex-Aファミリ向けにビルドしている。
もし、configureスクリプトを実行する時、undefined reference to 'rpl_malloc'というエラーが表示される場合は、
ac_cv_func_malloc_0_nonnull=yes ac_cv_func_realloc_0_nonnull=yes
オプションを付加する。
これは、autotoolsの仕様で、GLIBC以外のシステム(例. uClibc等)を使用しているからである。
# 32bit Cortex-A(Hard Float版)向けにビルドする場合 ac_cv_func_malloc_0_nonnull=yes ac_cv_func_realloc_0_nonnull=yes \ ../configure --prefix=<ソフトウェアのインストールディレクトリ> \ CC=/<GCC_ARMのインストールディレクトリ>/bin/arm-none-linux-gnueabihf-gcc \ CXX=/<GCC_ARMのインストールディレクトリ>/bin/arm-none-linux-gnueabihf-g++ \ --build=x86_64-unknown-linux-gnu --host=arm-none-linux-gnueabihf --target=arm-none-linux-gnueabihf \ --with-sysroot=/<GCC_ARMのインストールディレクトリ>/arm-none-linux-gnueabihf/libc --with-gnu-ld make -j $(nproc) LDFLAGS="-L/<GCC_ARMのインストールディレクトリ>/arm-none-linux-gnueabihf/lib" \ CFLAGS="-I/<GCC_ARMのインストールディレクトリ>/arm-none-linux-gnueabihf/include" make install
# 64bit Cortex-A向けにビルドする場合 ac_cv_func_malloc_0_nonnull=yes ac_cv_func_realloc_0_nonnull=yes \ ../configure --prefix=<ソフトウェアのインストールディレクトリ> \ CC=/<GCC_ARMのインストールディレクトリ>/bin/aarch64-none-linux-gnu-gcc \ CXX=/<GCC_ARMのインストールディレクトリ>/bin/aarch64-none-linux-gnu-g++ \ --build=x86_64-unknown-linux-gnu --host=aarch64-none-linux-gnu --target=aarch64-none-linux-gnu \ --with-sysroot=/<GCC_ARMのインストールディレクトリ>/aarch64-none-linux-gnu/libc --with-gnu-ld make -j $(nproc) LDFLAGS="-L/<GCC_ARMのインストールディレクトリ>/aarch64-none-linux-gnu/lib64" \ CFLAGS="-I/<GCC_ARMのインストールディレクトリ>/aarch64-none-linux-gnu/include" make install
Raspberry Pi
以下の例では、SourceForgeからダウンロードしたRaspberry Pi専用のGCC ARMツールチェーンを使用して、
任意のソフトウェアをRaspberry Pi向けにビルドしている。
ac_cv_func_malloc_0_nonnull=yes ac_cv_func_realloc_0_nonnull=yes \ ../configure --prefix=<ソフトウェアのインストールディレクトリ> \ CC=/<GCC_ARMのインストールディレクトリ>/bin/arm-linux-gnueabihf-gcc CXX=/<GCC_ARMのインストールディレクトリ>/bin/arm-linux-gnueabihf-g++ \ --build=x86_64-unknown-linux-gnu --host=arm-linux-gnueabihf --target=arm-linux-gnueabihf make -j $(nproc) make install
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++プログラミング言語を読むことを推奨する。