2.

C++のコンパイルと実行方法|g++の使い方とオプション

編集

C++のコンパイルと実行は、ソースコード(.cppファイル)をコンパイラで機械語の実行ファイルに変換し、その実行ファイルを起動するという2段階の手順で行います。代表的なコンパイラであるg++では、g++ main.cpp -o main でコンパイルし、生成された実行ファイルを ./main で実行するのが基本的な流れです。このページでは、g++を使ったコマンドラインでのコンパイルから、Visual Studioでのビルド、複数ファイルの扱い、エラーの見方までを順に解説します。

 

この記事の要点
  • C++のプログラムは「コンパイル(ソース→実行ファイル)」と「実行」の2段階で動かす。
  • g++での基本は g++ main.cpp -o main でコンパイルし、./main で実行する。
  • 主なオプションは -o(出力名)、-Wall(警告表示)、-std=c++17(規格指定)、-O2(最適化)、-g(デバッグ情報)。
  • Visual Studioではメニューやショートカットからビルドと実行をまとめて行える。
  • 複数ファイルは、すべての .cpp をまとめてコンパイルするか、分割コンパイルしてリンクする。
  • LinuxやmacOSでの実行にはカレントディレクトリを示す ./ が必要になる点に注意。

 

コンパイルとは

C++は、書いたソースコードをそのまま実行するのではなく、あらかじめコンピュータが理解できる機械語へ変換してから実行する「コンパイル型」の言語です。この変換を行うプログラムをコンパイラと呼びます。手順を整理すると、おおむね次のようになります。

  • ソースコードの作成:人間が読める形でC++のコードを .cpp ファイルに記述する。
  • コンパイル:コンパイラがソースコードを解析し、機械語の実行ファイルへ変換する。
  • 実行:生成された実行ファイルを起動して、プログラムの処理結果を得る。

厳密には、コンパイルの内部はプリプロセス・コンパイル・アセンブル・リンクといった工程に分かれますが、g++などのコマンドは通常これらをまとめて一度に行います。そのため、ふだんは「ソースから実行ファイルを作る」という1つの操作として捉えて差し支えありません。

 

g++での基本的なコンパイルと実行

ここでは、GCCに含まれるC++コンパイラ g++ を例に、コマンドラインでの基本手順を示します。まず、次のようなサンプルプログラムを main.cpp という名前で保存します。

main.cpp

#include <iostream>

 

int main() {

    std::cout << "Hello, World!" << std::endl;

    return 0;

}

 

このファイルがあるディレクトリで、次のコマンドを実行するとコンパイルできます。-o は出力する実行ファイル名を指定するオプションで、ここでは main という名前にしています。

g++ main.cpp -o main

 

エラーがなければ、同じディレクトリに実行ファイルが生成されます。続いて、その実行ファイルを起動します。LinuxやmacOSでは、カレントディレクトリにある実行ファイルを指すために先頭に ./ を付けます。

./main

 

画面に Hello, World! と表示されれば成功です。Windows環境(MinGWなど)では、-o で指定した名前に自動的に .exe が付いた実行ファイルが作られることが多く、その場合は main.exe.\main.exe のように起動します。なお -o を省略すると、多くの環境で a.out(Windowsでは a.exe)という既定の名前で出力されます。

 

ここで重要なのは、ソースコードを書き換えたら、その都度コンパイルをやり直す必要があるという点です。実行ファイルはコンパイルした時点のコードをもとに作られているため、.cpp を編集しただけでは実行結果は変わりません。「コードを直したのに結果が変わらない」というときは、コンパイルし直し忘れていないかをまず確認するとよいでしょう。コンパイルと実行をひとつのコマンドにまとめたい場合は、シェルの機能を使って次のように記述する方法もあります。

g++ main.cpp -o main && ./main

 

この書き方では、コンパイルが成功した(エラーで止まらなかった)ときにだけ続けて実行が行われます。コンパイルに失敗した場合は実行に進まないため、古い実行ファイルが誤って動いてしまうのを避けられます。日々の動作確認をすばやく繰り返したいときに便利な書き方です。

 

g++の主なオプション

g++には多くのオプションがありますが、まず押さえておきたいものを挙げます。複数のオプションは同時に指定できます。

オプション 意味 使用例
-o <名前> 出力する実行ファイル名を指定する。 g++ main.cpp -o app
-Wall 一般的な警告を幅広く表示する。 g++ -Wall main.cpp -o main
-std=c++17 準拠するC++規格を指定する(例:C++17)。 g++ -std=c++17 main.cpp -o main
-O2 実行速度を高めるための最適化を行う。 g++ -O2 main.cpp -o main
-g デバッガで利用するデバッグ情報を付加する。 g++ -g main.cpp -o main

 

たとえば、警告を表示しつつC++17規格でコンパイルしたい場合は、次のようにオプションを組み合わせます。

g++ -std=c++17 -Wall main.cpp -o main

 

-Wall は警告を表示するだけで、コンパイル自体は通る場合が多いオプションです。表示された警告は、初期化漏れや型の取り違えといった潜在的な不具合に気づく手がかりになるため、開発中は付けておくと役立ちます。利用できる規格(-std=c++11-std=c++20 など)は、使用しているg++のバージョンによって異なります。

 

Visual Studioでのビルドと実行

Windowsで統合開発環境を使う場合、Visual Studioを利用するとコンパイル(ビルド)から実行までを画面上の操作だけで行えます。一般的な流れは次のとおりです。

  • 「C++によるデスクトップ開発」などのワークロードを含めてVisual Studioをインストールする。
  • 新しいプロジェクトを作成し、ソースファイル(.cpp)を追加してコードを記述する。
  • メニューの「ビルド」からビルドを実行し、実行ファイルを生成する。
  • 「デバッグ」メニューの開始操作(デバッグありはF5、デバッグなしはCtrl+F5が割り当てられていることが多い)でプログラムを実行する。

Visual Studioでは、g++ではなくマイクロソフトのC++コンパイラ(MSVC)が使われます。コマンドを直接入力しなくても、規格や最適化などのオプションはプロジェクトのプロパティ画面から設定できます。ショートカットキーの割り当てはバージョンや設定によって変わることがあるため、メニュー表示で確認すると確実です。

 

複数ファイルのコンパイル

プログラムが大きくなると、機能ごとにソースファイルを分けるのが一般的です。複数の .cpp ファイルからなるプログラムは、それらをまとめてコンパイルすることで1つの実行ファイルを作れます。たとえば main.cpputil.cpp がある場合は、次のように両方を指定します。

g++ main.cpp util.cpp -o main

 

ファイルごとに先にオブジェクトファイルへ変換しておき、あとでまとめて実行ファイルにする「分割コンパイル」という方法もあります。-c オプションはコンパイルのみを行い、リンクをせずにオブジェクトファイル(.o)を生成します。

g++ -c main.cpp

g++ -c util.cpp

g++ main.o util.o -o main

 

分割コンパイルでは、変更したファイルだけを再コンパイルすればよいため、大規模なプロジェクトではビルド時間の短縮につながります。なお、関数の宣言などを共有するためのヘッダファイル(.h など)は、各 .cpp から #include で取り込みます。ヘッダファイル自体はコンパイル対象としてコマンドに並べる必要はありません。

 

エラーと警告の見方

コンパイル時にコンパイラが出力するメッセージは、大きく「エラー」と「警告」に分けられます。両者の違いを理解しておくと、対処の優先順位を判断しやすくなります。

  • エラー(error):コンパイルを完了できない問題。実行ファイルは生成されないため、必ず修正する必要がある。
  • 警告(warning):コンパイルは通るものの、問題の可能性がある箇所への注意喚起。実行ファイルは作られるが、内容を確認して対処するのが望ましい。

メッセージには通常、対象のファイル名・行番号・問題の内容が含まれます。複数のエラーが出ている場合は、後続のメッセージが最初のエラーに連鎖して発生していることもあるため、まず一番上に表示されたエラーから順に確認していくと原因を切り分けやすくなります。

 

よくある落とし穴 内容
実行時に ./ を付け忘れる LinuxやmacOSでは、カレントディレクトリにある実行ファイルは ./main のように ./ を付けないと見つからないことが多い。main だけでは「コマンドが見つからない」となる場合がある。
拡張子や出力名の取り違え ソースは .cpp、出力名は -o で指定した名前。Windowsでは実行ファイルに .exe が付くことがあり、起動時の名前が異なる点に注意する。
コンパイルエラーとリンクエラーの混同 構文の誤りなどはコンパイルエラー。関数の定義が見つからない、ファイルを指定し忘れた等で起こるのはリンクエラー(undefined referenceなど)。原因の段階が異なるため切り分けて対処する。

 

よくある質問(FAQ)

Q. g++が使えません。どうすればよいですか。
A. g++はGCCに含まれるコンパイラで、環境によっては別途インストールが必要です。Windowsでは、GCCをWindows向けに提供するMinGW系のツールを導入するか、Visual StudioのC++開発環境を利用する方法があります。導入後にコマンドが認識されない場合は、実行ファイルの場所が環境変数PATHに含まれているかを確認してください。

Q. -o を付けないとどうなりますか。
A. 出力名を指定しない場合、多くの環境で a.out(Windowsでは a.exe)という既定の名前で実行ファイルが作られます。意図した名前で管理したい場合や、複数のプログラムを区別したい場合は -o で明示的に名前を付けるとよいでしょう。

Q. 警告は無視しても問題ありませんか。
A. 警告はコンパイル自体を止めませんが、初期化漏れや意図しない型変換など、実行時の不具合につながる可能性のある箇所を示していることがあります。内容を読み、必要に応じて修正するのが安全です。-Wall を付けて警告を確認する習慣をつけると、問題の早期発見に役立ちます。

 

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. 環境構築
  2. コンパイルと実行方法
  3. 文法
  4. 関数

最近更新/作成されたページ