HOWTO · C++

GCC を使用して C++ プログラムをコンパイルする

この記事では、gcc コンパイラを使用して C++ プログラムをコンパイルする方法について説明します。

このページの内容

GCCでC++のソースファイルをコンパイルして実行するには、g++コンパイラードライバーを使います。g++ -o hello hello.cppを実行し、LinuxまたはmacOSでは続けて./helloを実行します。GCCはGNU Compiler Collection(GNUコンパイラーコレクション)で、g++は通常のプログラムに必要なC++標準ライブラリのリンクを含め、C++向けのビルド動作を選択します。以下では、コンパイラーの確認、最初のプログラム、よくある診断メッセージ、複数ファイルの簡単なビルドを説明します。

GCCとは何か、その重要性

GCCは、複数の言語に対応するコンパイラードライバーを含むコンパイラーコレクションです。C++の作業では、通常はg++を使うのが最も簡単です。ビルドではソースコードを変換し、生成されたオブジェクトコードと必要なライブラリをリンクして実行ファイルを作ります。1つのコマンドで両方の処理を行うことも、大きなプロジェクトでファイルごとにコンパイルしてからリンクすることもできます。

gccドライバーでもC++ソースをコンパイルできますが、g++と同じようにC++標準ライブラリを自動でリンクするわけではありません。GNU/Linuxのツールチェーンでは、gccに-lstdc++を指定してライブラリを明示的に要求できます。ただし、ライブラリの順序やプラットフォームによって事情が異なる場合があるため、通常のC++ビルドにはg++を使いましょう。ソースファイルには一般に.cppまたは.ccが使われます。大文字と小文字を区別するシステムでは、GCCは大文字の.CもC++として扱います。

GCCをインストールする

まず、ターミナルでg++ --versionを実行し、C++コンパイラーがすでに使えるか確認します。見つかった場合は、インストール済みコンパイラーのバージョンが表示されます。コマンドが使えない場合は、OSのパッケージマネージャー、またはそのシステムで推奨されているツールチェーンの提供元からC++ツールチェーンをインストールしてください。パッケージ名や手順は環境によって異なります。Ubuntuと一部の関連ディストリビューションでは、build-essentialにGCCなどのビルドツールが含まれています。Windowsでは、MinGW-w64などのGCCツールチェーンをインストールして、そのbinディレクトリをPATHに追加するか、別の対応済みC++ツールチェーンを使います。古い例に記載されたバージョン番号を頼りにせず、お使いのディストリビューションやツールチェーンの最新の手順に従ってください。

最初のC++プログラムを書く

作業用ディレクトリにhello.cppという名前のファイルを作成します。このプログラムは標準出力に1行を書き出します。

この例を実行してください。

#include <iostream>

int main() {
    std::cout << "Hello, World!\n";
    return 0;
}
Hello, World!

#include <iostream>は、std::coutで使うストリームの宣言を提供します。main関数はプログラムのエントリーポイントで、\nは出力行を終わらせます。出力例には英語のあいさつが表示されます。フェンス内のコードと出力はバイト単位で保持するため、表示文言は英語のままです。

C++プログラムをコンパイルする

hello.cppがあるディレクトリで、g++ -o hello hello.cppを実行すると、コンパイルと実行ファイル名の指定をまとめて行えます。-oオプションは出力名を指定します。省略すると、多くのUnix系システムではa.outなどの既定名が使われます。生成されるのはオブジェクトファイルではなく実行ファイルです。LinuxまたはmacOSでは./helloで実行します。Windowsのコマンドプロンプトでは、通常、カレントディレクトリからhello.exeを実行しますが、実際の呼び出し方はシェルやツールチェーンによって異なります。

GNU/Linuxを想定した別の方法では、gcc -o hello hello.cpp -lstdc++のように指定して、C++標準ライブラリを明示的に要求できます。ビルドシステムの都合でgccドライバーを使う必要がある場合に役立ちますが、通常のC++プログラムには、適切なC++向けリンク動作を自動で選ぶg++が適しています。

コンパイルエラーをデバッグする

診断メッセージは左から順に読みます。ソースファイルと行を示したうえで、問題の内容を説明しています。たとえば、<iostream>をインクルードせず、std::coutとも修飾せずにcoutを使うと、「coutが宣言されていない」という診断が表示されることがあります。不足しているヘッダーを追加し、std::coutを使ってから再ビルドしてください。正確な文言や行番号は、コンパイラーのバージョンやソースの構成によって異なります。

g++ -Wall -o hello hello.cppのように指定すると、GCCで一般的な警告を有効にできます。-Wallは役立つ出発点ですが、GCCが提供するすべての警告を有効にするわけではありません。警告は疑わしいコードを知らせる診断メッセージです。内容を確認し、コードを変更するかビルドオプションを変更するか判断してください。

複数のファイルをリンクする

あるソースファイルで関数を定義し、別のファイルから呼び出すことができます。たとえば、main.cppで<iostream>をインクルードし、int add(int, int);を宣言して、int main() { std::cout << add(2, 3) << '\n'; }を定義します。functions.cppでは、int add(int a, int b) { return a + b; }を定義します。この宣言と定義が一致しているため、コンパイラーは関数呼び出しを確認でき、リンカーは呼び出しを実装に結び付けられます。

2つのソースファイルを1つのコマンドでビルドします。g++ -o my_program main.cpp functions.cppを実行すると、それぞれのソースファイルがコンパイルされ、リンクされてmy_programという実行ファイルが生成されます。LinuxまたはmacOSでは./my_programを実行します。この例では5が表示されます。Windowsでは、シェルでサポートされている方法で、生成されたmy_program.exeを実行してください。

まとめ

通常のGCCによるC++ビルドでは、g++ -o program source.cppを使い、そのコマンドで生成された実行ファイルを実行します。gccドライバーでもC++をコンパイルできますが、GNU/Linuxのビルドでは-lstdc++を明示的に追加する必要がある場合があります。一般的なケースでは、g++を選べばこのライブラリ指定を追加せずに済みます。

よくある質問

  1. GCCとは何ですか? GCCはGNU Compiler Collection(GNUコンパイラーコレクション)で、C++、Cなど複数の言語向けのコンパイラードライバーを提供します。
  2. GCCがインストールされているか確認するには? C++ドライバーはg++ --version、Cドライバーはgcc --versionを実行して確認します。
  3. C++でgccではなくg++を使うのはなぜですか? g++は一般的なプログラムに必要な標準ライブラリを含む、C++向けのリンク動作を自動で選択します。gccを使う場合、GNU/Linuxのビルドでは-lstdc++を明示する必要があることがあります。
  4. 1つのコマンドで複数のC++ファイルをコンパイルできますか? はい。g++コマンドに各ソースファイルを並べます。たとえば、g++ -o my_program main.cpp functions.cppのように指定します。
  5. -oは何をしますか? 出力ファイル名を指定します。g++ -o hello hello.cppのようにビルドを最後まで行うコマンドでは、出力は実行ファイルです。