最終更新:2026-10-12
GCC コンパイルオプション詳解¶
皆さんはコードをコンパイルする際、よくいくつかの gcc flags を使用しますね。今回の記事では、比較的重要な gcc flag をいくつか整理していきます。
1.最適化 flag¶
最適化フラグは、コンパイルされたコードのパフォーマンスを向上させるために使われます。これらのフラグはコンパイル処理を高速化し、効率的なプログラムを生成できます。
よく使われる最適化フラグには以下のものがあります:
-O1、-O2、-O3、-Os:これらのフラグはアプリケーションの最適化レベルを制御します。
-O1 は基本的な最適化を適用し、-O2 と -O3 はより高度な最適化を提供します。-Os はコードサイズを最適化します。
-finline-functions、-funroll-loops:これらのフラグはそれぞれ関数のインライン化とループ展開の最適化を制御し、関数呼び出しのオーバーヘッドを排除し、ループの反復を減らすことを目的としています。
2.デバッグ Flag¶
デバッグフラグは、デバッグツールがコードを追跡・分析できるよう、追加情報の提供に役立ちます。
よく使われるデバッグフラグには以下のものがあります:
-g:このフラグは、コンパイル後の実行ファイルにデバッグシンボルを含めます。
-ggdb:このフラグは、GCC が GNU デバッガ(GDB)に適した形式でデバッグ情報を生成するようにします。
3.警告 Flag¶
警告フラグは、潜在的な問題、コーディングの誤り、またはコード内の問題のあるプラクティスを特定するのに役立ちます。警告フラグを有効にすると、コンパイラはこれらの状況に対して警告を発し、開発者はコードの品質を向上させることができます。
よく使われる警告フラグには以下のものがあります:
-Wall:このフラグは、さまざまな潜在的な問題を網羅する包括的な警告のセットを有効にします。
-Werror:このフラグは警告をエラーとして扱い、コンパイラは警告に遭遇するとコンパイル処理を停止します。
4.プリプロセッサ Flag¶
プリプロセッサフラグは、ソースコード内の # で始まるディレクティブを処理します。これらのフラグはマクロを定義し、コンパイルを制御します。
よく使われるプリプロセッサフラグには以下のものがあります:
-D:このフラグは、コンパイルの過程でマクロを定義するために使用されます。例えば、-DDEBUG は DEBUG マクロの定義に使え、その存在の有無に応じて条件コンパイルを有効にできます。
-I:このフラグは、ヘッダファイルが存在する追加のディレクトリを指定するために使用されます。コンパイル時にプリプロセッサが必要なヘッダファイルを見つけるのに役立ちます。
5.リンカ Flag¶
リンカフラグはリンク処理を制御します。リンク処理はコンパイルの後に行われ、オブジェクトファイルとライブラリを組み合わせて最終的な実行ファイルを生成します。
よく使われるリンカフラグには以下のものがあります:
-l:このフラグは外部ライブラリをリンクするために使用されます。例えば、-lpthread は POSIX スレッドライブラリをリンクします。
-L:このフラグは、ライブラリが存在する追加のディレクトリを指定するために使用されます。リンクの過程でリンカが必要なライブラリを見つけるのに役立ちます。
6.プラットフォーム固有の flag¶
GCC は特定のプラットフォーム向けのフラグを提供しており、開発者は特定のアーキテクチャをターゲットにしたり、特定のプラットフォームの機能を有効にしたりできます。特定のハードウェアやオペレーティングシステム向けにコードを開発する際、これらのフラグは非常に役立ちます。
プラットフォーム固有のフラグには以下のものがあります:
-march:このフラグはターゲットアーキテクチャを指定します。例えば、-march=native は GCC にホストマシンのアーキテクチャに最適化するよう指示します。
-m32 と -m64:これらのフラグは、32 ビットと 64 ビットのどちらのターゲット向けにコンパイルするかを指定します。
7.その他の Flag¶
前述のカテゴリーに加えて、他にもいくつかのフラグがあります。
よく使われるその他のフラグには以下のものがあります:
-std:このフラグは、使用する C 言語標準のバージョンを指定します。例えば、-std=c99 は C99 標準を選択します。 -pedantic:このフラグは、選択した C 言語標準への厳密な準拠を有効にし、非標準または疑わしいコード構造に対して追加の警告を提供します。 -Wextra:このフラグは、-Wall で有効になる警告を超える追加の警告を有効にし、より包括的なコード分析を提供します。
なお、フラグの可用性と機能は、GCC のバージョンやプラットフォームによって異なる場合があります。そのため、特定のフラグとその使い方についての詳細は、GCC のドキュメントや関連リソースを参照することをお勧めします。
完全なドキュメントのアドレス:
関連トピック¶
- Bazel で C++ プロジェクトをビルド | C++那些事
- Bazel と LLDB の連携デバッグ | C++那些事
- CMake 入門と実践 | C++那些事
- Conan C++ パッケージ管理入門 | C++那些事
- C++ Insights によるコンパイル期観察 | C++那些事
- C++ Jupyter Notebook インタラクティブ | C++那些事
- C++ string から int への変換 | C++那些事
- C++ dbg-macro デバッグマクロ | C++那些事
- GDB で C++ プログラムをデバッグ | C++那些事
- GDB Python 拡張デバッグ | C++那些事