2.2. GNU C++ コンパイラー
2.2.1. C++ コンパイラーのインストール
Red Hat Developer Toolset では、GNU C++ コンパイラーは devtoolset-12-gcc-c++ パッケージで提供され、「Red Hat Developer Toolset のインストール」 の説明に従って devtoolset-12-toolchain パッケージで自動的にインストールされます。
2.2.2. C++ コンパイラーの使用
コマンドラインで C++ プログラムをコンパイルするには、以下のように g++
コンパイラーを実行します。
$ scl enable devtoolset-12 'g++ -o output_file source_file...'
これにより、現在の作業ディレクトリーに output_file という名前のバイナリーファイルが作成されます。-o
オプションを省略すると、g++
コンパイラーはデフォルト a.out
でという名前のファイルを作成します。
複数のソースファイルで構成されるプロジェクトで作業する場合、各ソースファイルのオブジェクトファイルを最初にコンパイルしてから、これらのオブジェクトファイルをリンクすることが一般的です。これにより、単一のソースファイルを変更する場合は、プロジェクト全体をコンパイルせずにこのファイルのみを再コンパイルできます。コマンドラインでオブジェクトファイルをコンパイルするには、以下のコマンドを実行します。
$ scl enable devtoolset-12 'g++ -o object_file -c source_file'
これにより、object_file という名前のオブジェクトファイルが作成されます。-o
オプションを省略すると、g++
コンパイラーは、ファイル .o
拡張子が付いたソースファイルからという名前のファイルを作成します。オブジェクトファイルをリンクし、バイナリーファイルを作成します。
$ scl enable devtoolset-12 'g++ -o output_file object_file...'
この scl
ユーティリティーを使用してコマンドを実行すると、これを Red Hat Enterprise Linux システムに優先して使用する Red Hat Developer Toolset バイナリーで実行することができることに注意してください。これにより、デフォルトで Red Hat Developer Toolset g++
でシェルセッションを実行できます。
$ scl enable devtoolset-12 'bash'
使用中の g++
のバージョンを確認するには、以下を行います。
$ which g++
Red Hat Developer Toolset の g++
実行可能なパスは、/opt で始まります。以下のコマンドを使用して、バージョン番号が Red Hat Developer Toolset g++
と一致することを確認することができます。
$ g++ -v
例2.3 コマンドラインでの C++ プログラムのコンパイル
以下の内容を含むソースファイル hello.cpp
について考えてみましょう。
#include <iostream> using namespace std; int main(int argc, char *argv[]) { cout << "Hello, World!" << endl; return 0; }
Red Hat Developer Toolset の g++
コンパイラーを使用して、このソースコードをコマンドラインでコンパイルします。
$ scl enable devtoolset-12 'g++ -o hello hello.cpp'
これにより、現在の作業ディレクトリーに hello
という名前のバイナリーファイルが作成されます。
2.2.3. C++ プログラムの実行
プログラムを g++
コンパイルすると、実行可能なバイナリーファイルが作成されます。コマンドラインでこのプログラムを実行するには、実行ファイルがあるディレクトリーに移動し、これを実行します。
$ ./file_name
例2.4 コマンドラインでの C++ プログラムの実行
例2.3「コマンドラインでの C++ プログラムのコンパイル」 にあるように、hello
バイナリーファイルを正常にコンパイルしたと仮定して実行できます。
$ ./hello
Hello, World!
2.2.4. C++ 互換性
すべての -std
モードの Red Hat Enterprise Linux バージョン 5、6、7、および Red Hat Developer Toolset バージョン 1 から 10 のすべてのコンパイラーは、C++98 モードの他のコンパイラーと互換性があります。
C++11、C++14、または C++17 モードのコンパイラーは、同じリリースシリーズであれば、同じモードでの別のコンパイラーとの互換性が保証されています。
サポートされる例:
- Red Hat Developer Toolset 6.x からの C++11 および C++11
- Red Hat Developer Toolset 6.x からの C++14 および C++14
- Red Hat Developer Toolset 10.x からの C++17 および C++17
- Red Hat Developer Toolset 10.x の GCC コンパイラーは、C++20 を使用してコードを構築することは可能ですが、この機能は Red Hat では実験的で、サポートされていません。
- このセクションで説明されている互換性情報はすべて、GCC C++ コンパイラーの Red Hat が提供するバージョンにのみ関連します。
2.2.4.1. C++ ABI
-std=c++98
または -std=gnu++98
で Red Hat Developer Toolset ツールチェーンが明示的にビルドした C++98 準拠のバイナリーまたはライブラリーは、Red Hat Enterprise Linux 5、6、または 7 システム GCC が構築したバイナリーおよび共有ライブラリーと自由に混在できます。
Red Hat Developer Toolset 12.1 のデフォルトの言語標準設定は、オプション -std=gnu++17
を明示的に使用する場合と同等の GNU 拡張機能を備えた C++17 です。
Red Hat Developer Toolset では、それぞれのフラグでコンパイルされたすべての C++ オブジェクトが Red Hat Developer Toolset 6 以降を使用してビルドされている場合、C++14 言語バージョンの使用がサポートされます。デフォルトモードの C++98 でシステム GCC によってコンパイルされたオブジェクトには互換性がありますが、C++11 モードまたは C++14 モードのシステム GCC でコンパイルされたオブジェクトには互換性がありません。
Red Hat Developer Toolset 10.x 以降では、C++17 言語バージョンの使用は実験的なものになり、Red Hat によってサポートされます。C++17 でコンパイルされたすべての C++ オブジェクトは、Red Hat Developer Toolset 10.x 以降を使用してビルドする必要があります。
ご使用のアプリケーションで C++11、C++14、および C++17 機能を使用するには、上記の ABI 互換性情報を慎重に検討する必要があります。
-std=c++0x
または -std=gnu++0x
フラグを使用して Red Hat Enterprise Linux 7 システムツールチェーン GCC によってビルドされたオブジェクト、バイナリー、およびライブラリーと、Red Hat Developer Toolset の GCC を使用して C++11 以降の言語バージョンでビルドされたものとを混合することは、明示的にサポートされていません。
上記で説明した C++11、C++14、および C++17 ABI のほかに、Red Hat Developer Toolset では Red Hat Enterprise Linux アプリケーションの互換性仕様 は変更されません。Red Hat Developer Toolset で構築されたオブジェクトを、Red Hat Enterprise Linux 7 ツールチェーン (特に .o
/.a
ファイル) で構築したオブジェクトと混在する場合、Red Hat Developer Toolset ツールチェーンはどのリンクにも使用してください。これにより、Red Hat Developer Toolset が提供する新しいライブラリー機能は、リンク時に解決されます。
ベクトルの長さを持つシステムで名前が競合しないように、SIMD ベクトルタイプの新しい標準マングリングが追加されました。Red Hat Developer Toolset のコンパイラーは、デフォルトで新しいマングリングを使用します。GCC C++ コンパイラーコールに -fabi-version=2
または -fabi-version=3
オプションを追加して、以前の標準マングリングを使用できます。以前の mangling を使用するコードの警告を表示するには、-Wabi
オプションを使用します。
Red Hat Enterprise Linux 7 では、GCC C++ コンパイラーはデフォルトで古い mangling を使用しますが、強固なエイリアスに対応するターゲットに新しいマングリングを持つエイリアスをエミュレートします。コンパイラーコールに -fabi-version=4
オプションを追加して、新しい標準マングリングを使用できます。以前の mangling を使用するコードの警告を表示するには、-Wabi
オプションを使用します。