GCC のオプション

SOLID が使用している、あるいは設定から選択可能な GCC コンパイラドライバのオプションについて解説します。GCC のコンパイラドライバは C の場合は gcc.exe、C++ の場合は g++.exe という名前の exe ファイルです。コンパイラドライバがコンパイラ(C の場合は cc1.exe、C++ の場合は cc1plus.exe)やアセンブラ(as.exe)、リンカ(ld.exe)に対して、ドライバに指定されたオプションを適切な形に変換して渡し、コマンドが実行されます。

オプションは、プロジェクト、あるいはファイルのプロパティから確認・設定することができます。(Debug や Release 等、構成ごとにオプションは異なり、個別に設定することになります。)

基本的には、標準的な設定を SOLID アプリケーションウィザード(ファイル > 新規作成 > プロジェクト)が自動生成するので、細かな設定項目を意識する必要はありません。必要に応じてカスタマイズしたい項目のみを設定する形になります。

プロジェクト、あるいはファイルを右クリックして、「プロパティ > 構成プロパティ > C/C++」から、「プリプロセッサオプション」「ディレクトリオプション」「コンパイラオプション」「アセンブラオプション」を、それぞれの項目ごとに設定することができます。

../_images/toolchain-compiler-option1.png

実際に指定される全てのオプションは「コマンドライン」から確認できます。(ただし、IDE が環境変数経由で暗黙的に渡しているオプションは表示されません。)他の項目で設定できないオプションを設定したい場合は、この項目の「追加のオプション」のテキストボックスに、任意のオプションを書くことができます。

../_images/toolchain-compiler-option2.png

以下の解説では、オプション先頭の - (ハイフン)は省略して記載します。また、見やすさのために = (イコール)の両端にスペースを入れていますが、実際に記述する際には連続して記述する必要があります。

プリプロセッサオプション

プリプロセッサを制御するオプションです。

  • D NAME

    #define NAME 1 と同じ意味になります。

  • D NAME = DEFINITION

    #define NAME DEFINITION と同じ意味になります。

  • nostdinc

    C の標準インクルードパスを検索しないようにします。

  • nostdinc++

    C++ の標準インクルードパスを検索しないようにします。

  • idirafter PATH

    標準のシステムインクルードパスの最後に探索パスを追加します。これは特別な目的のために暗黙的に使用されているオプションなので、通常は使用しないでください。(システムインクルードパスを -I オプションで書き換えてしまうと混乱が生じるため、システムインクルードパスと同名のパスが -I で指定された場合は無視されます。明示的にシステムインクルードパスの先頭に追加したい場合は -isystem を使用してください。)

ディレクトリオプション

ヘッダファイルやライブラリファイルの検索対象パス(ディレクトリ)を追加します。 オプションの指定順(左から右)にディレクトリを検索します。

  • I dir

    ヘッダファイルの探索パスを追加します。

  • L dir

    ライブラリファイルの探索パスを追加します。

  • specs= file

    specs ファイル file を指定します。

コンパイラオプション

コンパイラを制御するオプションです。

  • 共通オプション

    • fsigned-char

    char 型を符号あり(signed)として扱います。 GCC ARM ターゲットのデフォルトは符号無し(unsgined)ですが、ツールチェーンに付属のライブラリの一部が歴史的な理由により char が signed 前提の仕様になっているため、互換性維持のために使用されています。ツールチェーン付属のライブラリはこのオプション付きでビルドされているので必須オプションとなります。

    • fno-short-enums

    enum 型を GCC ARM ターゲットのデフォルトである可変長幅(-fshor-enums)ではなく、32 bit 幅固定で扱います。これはツールチェーン s002 からの仕様です。(s001 では -fshor-enums がデフォルトでした。)ツールチェーン付属のライブラリはこのオプション付きでビルドされているので必須オプションとなります。

    • fomit-frame-pointer

    frame pointer の退避/復旧コードの生成を省略し、追加のレジスタとして使用する最適化オプションです。

    • O0

    Debug ビルド時に指定されます。一切最適化を行わないので、変数が消えたりすることが無いため、デバッグがやりやすくなります。Og という、デバッグを妨げない範囲で最適化を行うというオプションもありますが、必ず思い通りのデバッグができるわけではないので、上級者向けとなります。

    • O2

    Release ビルド時に指定されます。ほぼ全ての一般的な最適化が有効になります。他にも段階的に O1 と O3 の最適化オプションが存在します。数字が大きいほど様々な最適化を行い、コンパイル時間が増大します。O1 から O3 は速度の最適化なので、バイナリサイズは増える場合があります。サイズの最適化を行う場合は Os オプションを使用してください。

    • g

    DWARF 形式のデバッグ情報を出力します。(-gstabs, -gstabs+ で stabs, stabs+ 形式も選択はできますが、非推奨です。)

    • gdwarf-2, gdwarf-3

    DWARF 2 や 3 形式のデバッグ情報を出力します。-g を指定した場合に、デバッガが未対応のデバッグ情報が出力されてしまう場合がまれにあり、その場合のワークアラウンドとして使用します。DWARF 2 は安全ですが、最適化時のデバッグに難があるため、DWARF 3 推奨です。

    • Wall

    一般的な警告を全て有効にします。

    • Wextra

    Wall で有効にならない警告を、さらにいくつか追加し、厳しく警告します。

    • Werror

    警告をエラーとして扱います。

    • w

    全ての警告を抑制します。(非推奨)

  • ARM 専用オプション

    • mlittle-endian

    リトルエンディアンのコードを生成します。

    • mthumb-interwork

    ARM/Thumb 命令間での関数呼び出しをサポートするコードを生成します。このオプションを指定しない場合、ARMv5 以前のアーキテクチャでは ARM/Thumb コードを混在して使用することはできません。

    • mcpu= ARCH

    コード生成の対象となる ARM のアーキテクチャ ARCH を指定します。

    • mfpu= FPU

    コード生成の対象となる浮動小数点数演算ハードウェア FPU を指定します。

    • mfloat-abi= ABI

    浮動小数点数演算の ABI を指定します。 soft は浮動小数点数演算に FPU を使用しない、ソフトウェアエミュレーション関数を呼び出すコードを生成します。softfp は FPU を使用しますが、soft と ABI 互換性があり、リンク可能です。hard は FPU に特化したコードを生成し、効率的ですが、soft/softfp オプションでコンパイルしたコードとリンクすることはできません。

アセンブラオプション

アセンブラを制御するオプションです。

  • Wa, option

    アセンブラに option オプションを渡します。 option がカンマ(,)を含む場合、カンマで分割して複数のオプションとして渡します。

リンカオプション

リンカを制御するオプションです。このオプションは C/C++ プロパティではなく、「リンカー」のプロパティの各項目で設定します。設定方法等は C/C++ プロパティと同様です。

../_images/toolchain-compiler-option3.png
  • l library

    lib library .a ファイルをリンクします。ファイルは標準のライブラリパスと、-L オプションで追加されたパスの中から検索されます。

  • T script

    リンカスクリプトファイル script を指定します。

  • nostartfiles

    標準のスタートアップファイルを使用しません。

  • nodefaultlibs

    標準ライブラリ(libgcc、libc、libstdc++)を使用しません。-l オプションで指定されたファイルと、標準のスタートアップファイルは使用されます。GCC はこのオプションを指定した場合でも、memcmp, memset, memcpy, memmove 関数を生成コード内で使用する場合があるので、これらの関数の実装が必要です。このオプションを使用した場合、GCC が生成コード内で使用する libgcc.a に含まれる関数もリンクされなくなるため、大抵の場合に -lgcc オプションの指定が必要です。

  • nostdlib

    nostartfiles と nodefaultlibs を両方指定した場合と同じ意味になります。

  • Wl, option

    リンカに option オプションを渡します。 option がカンマ(,)を含む場合、カンマで分割して複数のオプションとして渡します。