GCCオプション · 1 min read · Jan 22, 2026

珍しいが便利なGCCコマンドラインオプション

ソフトウェアツールは通常、複数の機能を提供しますが、ほとんどの方が同意するように、すべての機能がすべての人に使われるわけではありません。一般的に言えば、それに何の問題もありません。各ユーザーにはそれぞれの要件があり、その範囲内でツールを使用します。しかし、ツールを探求し続けることは常に良いことであり、いつその機能が役に立つか分からないので、貴重な時間を節約できるかもしれません。

例として、コンパイラを挙げましょう。良いプログラミング言語のコンパイラは常に多くのオプションを提供しますが、ユーザーは一般的に限られたセットしか知らず、使用しません。特に、C言語の開発者であり、Linuxを開発プラットフォームとして使用している場合、gccコンパイラを使用している可能性が非常に高いです。gccは無限のコマンドラインオプションのリストを提供します。

gccにコンパイルプロセスの各段階で出力を保存するように要求できることをご存知ですか?生成された警告のために使用する-Wallオプションが、特定の警告をカバーしていないことをご存知ですか?一般的には使用されないが、特定のシナリオ、例えばコードのデバッグ中に非常に役立つコマンドラインgccオプションがたくさんあります。

この記事では、そのようなオプションのいくつかを取り上げ、必要な詳細を提供し、必要に応じて理解しやすい例を通じて説明します。

ただし、先に進む前に、このチュートリアルで言及されているすべての例、コマンド、および指示は、Ubuntu 16.04 LTSでテストされており、使用したgccのバージョンは5.4.0です。

各コンパイル段階で中間出力を確認する

gccコンパイラを使用してCコードをコンパイルする際、コードが通過する段階が大きく分けて4つあることをご存知ですか?これらは前処理、コンパイル、アセンブリ、およびリンクです。各段階の後、gccは次の段階に渡される一時出力ファイルを生成します。これらはすべて生成される一時ファイルであり、したがって私たちはそれを見ることができません。私たちが見るのは、コンパイルコマンドを発行し、実行可能なバイナリを生成することだけです。

しかし、デバッグ中に、例えば前処理段階の後にコードがどのように見えたかを確認する必要があるとしましょう。その場合、どうしますか?良いことに、gccコンパイラは、標準のコンパイルコマンドで使用できるコマンドラインオプションを提供しており、そうすればコンパイラによって通常は削除される中間ファイルを取得できます。私たちが話しているオプションは-save-tempsです。

以下は、このオプションについてgccのマニュアルページが言っていることです:

           通常の「一時」中間ファイルを永久に保存します。現在のディレクトリに配置し、ソースファイルに基づいて名前を付けます。したがって、foo.cを-c -save-tempsでコンパイルすると、foo.iおよびfoo.sファイルが生成され、foo.oも生成されます。これは、コンパイラが通常は統合された前処理器を使用しているにもかかわらず、前処理されたfoo.i出力ファイルを作成します。

           -xコマンドラインオプションと組み合わせて使用すると、-save-tempsは中間ファイルと同じ拡張子の入力ソースファイルを上書きしないように賢明です。中間ファイルを取得するには、-save-tempsを使用する前にソースファイルの名前を変更する必要があります。

以下は、このオプションをどのように使用できるかの例コマンドです:

gcc -Wall -save-temps test.c -o test-exec

そして、上記のコマンドが実行された後にすべての中間ファイルが実際に生成されたことを確認した方法は次のとおりです:

上のスクリーンショットに示されているように、test.itest.s、およびtest.oファイルは-save-tempsオプションによって生成されました。これらのファイルは、それぞれ前処理、コンパイル、およびリンク段階に対応しています。

コードのデバッグとプロファイリングの準備をする

ソースコードをデバッグおよびプロファイリングするための専用ツールがあります。例えば、gdbはデバッグ目的で使用され、gprofはプロファイリング目的で人気のあるツールです。しかし、コードをデバッグおよびプロファイリングの準備をするためにgccが提供する特定のコマンドラインオプションがあることをご存知ですか?

デバッグから始めましょう。gdbを使用してコードをデバッグするには、gccコンパイラが提供する-gコマンドラインオプションを使用してコードをコンパイルする必要があります。このオプションは基本的に、gccがgdbがプログラムを正常にデバッグするために必要なデバッグ情報を生成することを許可します。

このオプションを使用する予定がある場合は、このオプションに関するgccのマニュアルページの詳細を確認することをお勧めします。そのいくつかは、場合によっては重要なことがあるかもしれません。例えば、以下はマニュアルページからの抜粋です:

           GCCは-gを-Oと一緒に使用することを許可します。最適化されたコードによって取られるショートカットは、時折驚くべき結果を生むことがあります。宣言した変数が全く存在しない場合があるかもしれません。制御の流れが予期しない場所に一時的に移動することがあります。定数結果を計算するために実行されない文や、すでに手元にある値の文があるかもしれません。ループから移動されたために異なる場所で実行される文があるかもしれません。

           それにもかかわらず、最適化された出力をデバッグすることは可能です。これは、バグがあるかもしれないプログラムに最適化を使用することが合理的であることを示しています。

gdbだけでなく、-gオプションを使用してコードをコンパイルすることは、Valgrindのmemcheckツールを完全に活用する可能性も開きます。memcheckは、プログラマーがコード内のメモリリーク(もしあれば)をチェックするために使用します。このツールについての詳細は、こちらで学ぶことができます。

次に、gprofを使用してコードプロファイリングを行うには、-pgコマンドラインオプションを使用してコードをコンパイルする必要があります。これにより、gccはgprofによるコード分析に必要なプロファイリング情報を書き込むための追加コードを生成します。「データを取得したいソースファイルをコンパイルする際にはこのオプションを使用し、リンク時にも使用する必要があります」とgccのマニュアルページは述べています。gprofを使用してコードプロファイリングを行う方法について詳しく知りたい場合は、当社のウェブサイトのこの専用チュートリアルをご覧ください。

注意-gおよび-pgオプションの使用は、前のセクションで-save-tempsオプションが使用された方法と同様です。

結論

gccのプロでない限り、この記事で何か新しいことを学んだことと思います。これらのオプションを試してみて、どのように機能するかを確認してください。一方で、このチュートリアルシリーズの次の部分を待っていてください。そこで、さらに興味深く便利なgccコマンドラインオプションについて議論します。

Share: X/Twitter LinkedIn

新しい投稿を受信箱で受け取る

スパムはありません。いつでも購読を解除できます。