SOLID が使用しているオプション

SOLID が使用している、あるいは IDE で選択可能なオプションについて解説します。オプションは IDE 上で、プロジェクト、あるいはファイルのプロパティから確認・設定することができます。(Debug_XXX や Release 等、構成ごとにオプションは異なり、個別に設定することになります。)

基本的には、KMC や半導体ベンダーから既に設定済みのプロジェクトファイルが配布されるか、標準的な設定を SOLID アプリケーションウィザード(ファイル > 新規作成 > プロジェクト)が自動生成することになるので、ユーザは通常、設定項目の詳細を意識する必要はありません。必要に応じてカスタマイズしたい項目のみを設定する形になります。

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

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

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

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

SOLID ツールチェーンの仕様により、必ず指定しなければいけないオプションには「必須」と記載されています。

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

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

-D<NAME>
#define <NAME> 1 と同じ意味になります。
-D<NAME>=<DEFINITION>
#define <NAME> <DEFINITION> と同じ意味になります。
-nostdinc
C の標準インクルードパスを検索しないようにします。
-nostdinc++
C++ の標準インクルードパスを検索しないようにします。
-idirafter <PATH>
システムインクルード検索パスのリストの最後に <PATH> を追加します。これは特別な目的のために暗黙的に使用されているオプションなので、通常は使用しないでください。(システムインクルード検索パスを -I オプションで書き換えてしまうと混乱が生じるため、システムインクルードパスと同名のパスが -I で指定された場合は無視されます。明示的にシステムインクルード検索パスの先頭に追加したい場合は -isystem を使用してください。)

ディレクトリオプション

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

-I <directory>
ヘッダファイルの探索パスを追加します。
-L <directory>
ライブラリファイルの探索パスを追加します。
-specs=<file>
-specs ファイル <file> を指定します。(GCC のみ。)

コンパイラオプション

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

  • 共通オプション

    -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

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

    -O0

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

    -O2

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

    -g

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

    -gdwarf-2, -gdwarf-3

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

    -Wall

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

    -Wextra

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

    -w (非推奨)

    全ての警告を抑制します。

  • ARM 専用オプション

    -mlittle-endian (必須)

    リトルエンディアンのコードを生成します。SOLID はビッグエンディアンをサポートしないので必須です。

    -mthumb-interwork

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

    -mcpu=<RCH>

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

    -mfpu=<FPU>

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

    -mfloat-abi=<ABI>
    浮動小数点数演算の <ABI> を指定します。
    soft

    浮動小数点数演算に FPU を使用しない、ソフトウェアエミュレーション関数を呼び出すコードを生成します。

    softfp

    FPU を使用しますが、soft と ABI 互換性があり、リンク可能です。

    hard

    FPU に特化したコードを生成し、効率的ですが、soft/softfp オプションでコンパイルしたコードとリンクすることはできません。

アセンブラオプション

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

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

リンカオプション

../_images/toolchain-compiler-option3.png

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

-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> がカンマ(,)を含む場合、カンマで分割して複数のオプションとして渡します。