2.2. GNU C++ コンパイラー
2.2.1. C++ コンパイラーのインストール
Red Hat Developer Toolset では、GNU C++ コンパイラーは devtoolset-9-gcc パッケージで提供され、「Red Hat Developer Toolset のインストール」 の説明に従って devtoolset-9-toolchain パッケージで自動的にインストールされます。
2.2.2. C++ コンパイラーの使用
コマンドラインで C++ プログラムをコンパイルするには、以下のように g++
コンパイラーを実行します。
$ scl enable devtoolset-9 'g++ -o output_file source_file...'
これにより、現在の作業ディレクトリーに output_file という名前のバイナリーファイルが作成されます。-o
オプションを省略すると、g++
コンパイラーはデフォルトで a.out
という名前のファイルを作成します。
複数のソースファイルで構成されるプロジェクトで作業する場合、各ソースファイルのオブジェクトファイルを最初にコンパイルしてから、これらのオブジェクトファイルをリンクすることが一般的です。これにより、単一のソースファイルを変更する場合は、プロジェクト全体をコンパイルせずにこのファイルのみを再コンパイルできます。コマンドラインでオブジェクトファイルをコンパイルするには、以下のコマンドを実行します。
$ scl enable devtoolset-9 'g++ -o object_file -c source_file'
これにより、object_file という名前のオブジェクトファイルが作成されます。-o
オプションを省略すると、コンパイラーは、ファイル g++
拡張子が付いたソースファイルから .o
という名前のファイルを作成します。オブジェクトファイルをリンクし、バイナリーファイルを作成します。
$ scl enable devtoolset-9 'g++ -o output_file object_file...'
この scl
ユーティリティーを使用してコマンドを実行すると、これを Red Hat Enterprise Linux システムに優先して使用する Red Hat Developer Toolset バイナリーで実行することができることに注意してください。これにより、デフォルトで Red Hat Developer Toolset g++
でシェルセッションを実行できます。
$ scl enable devtoolset-9 '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-9 '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、2、3、4、および 6 のすべてのコンパイラーは、C++98 モードの他のコンパイラーと互換性があります。
C++11 モードまたは C++14 モードのコンパイラーは、C++11 モードまたは C++14 モードのコンパイラーが同じリリースシリーズ (例: Red Hat Developer Toolset 6.x) の別のコンパイラーと互換性がある場合にのみ保証されます。
- Red Hat Developer Toolset 7.x および 8.x のコンパイラーは、C++17 を使用してコードをビルドできますが、この機能は実験的で、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 のデフォルトの言語標準設定は、GNU 拡張との C++14 で、明示的に -std=gnu++14
を使用するオプションと同じです。
Red Hat Developer Toolset では、それぞれのフラグでコンパイルされたすべての C++ オブジェクトが Red Hat Developer Toolset 6 以降を使用してビルドされている場合、C++14 言語バージョンの使用がサポートされます。デフォルトモードの C++98 でシステム GCC によってコンパイルされたオブジェクトには互換性がありますが、C++11 モードまたは C++14 モードのシステム GCC でコンパイルされたオブジェクトには互換性がありません。
Red Hat Developer Toolset では、C++17 言語バージョンの使用は実験的なもので、それぞれのフラグでコンパイルされたすべての C++ オブジェクトが同じメジャーバージョンの GCC を使用して構築されている場合に限り、Red Hat Developer Toolset で可能です。Red Hat Developer Toolset の後続のメジャーバージョンは GCC の後続のメジャーリリースを使用する可能性があるため、-std=c++17
および -std=gnu++17
オプションでビルドされたオブジェクト、バイナリーファイル、およびライブラリーの前方互換性は保証できません。
ご使用のアプリケーションで C++11 機能および C++14 機能を使用するには、上記の ABI 互換性情報を考慮する必要があります。
Red Hat Enterprise Linux 7 システムツールチェーンが、-std=c++0x
または -std=gnu++0x
フラグを使用して構築したオブジェクト、バイナリー、およびライブラリーを混在させると、Red Hat Developer Toolset の GCC を使用してビルドされた -std=c++11
-std=gnu++11
または -std=c++14
または -std=gnu++14
フラグで構築されたものが明示的にサポートされません。
上記で説明した C++11 および C++14 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
オプションを追加して、以前の標準マングリングを使用できます。古いマングリングを使用するコードに関する警告を表示するには、-Wabi
オプションを指定します。
Red Hat Enterprise Linux 7 では、GCC C++ コンパイラーはデフォルトで古い mangling を使用しますが、強固なエイリアスに対応するターゲットに新しいマングリングを持つエイリアスをエミュレートします。コンパイラーコールに -fabi-version=4
オプションを追加して、新しい標準マングリングを使用できます。古いマングリングを使用するコードに関する警告を表示するには、-Wabi
オプションを指定します。