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

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

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

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

../_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++ の標準インクルードパスを検索しないようにします。

-isystem <PATH>, -idirafter <PATH>

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

ディレクトリオプション

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

-I <directory>

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

-L <directory>

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

-specs=<file>

specs ファイル <file> を指定します。(GCC のみ。)

コンパイラオプション

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

共通オプション

-fsigned-char

char 型を符号あり(signed)として扱います。AArch64/ARM ターゲットの GCC/Clang コンパイラのデフォルトは符号無し(unsigned)ですが、歴史的な理由により exeGCC は全てのアーキテクチャを signed char に統一してきたため、現在でも互換性維持のためこのオプションが指定されています。exeGCC のライブラリはこのオプションを指定してビルドされていますが、char 型の符号に依存しないように実装されているので、デフォルトが unsigned char でも signed char でも、あるいは指定無しでも正常動作します。

-fno-short-enums, -fshort-enums

GCC のデフォルトは -fshort-enums で enum サイズは取りうる値の最大値に応じた可変長となります。一方 Clang は -fno-short-enums がデフォルトで enum は 4 バイトまたは 8 バイトの固定長となります。exeGCC は GCC でビルドしたライブラリを Clang も使用するので、GCC に常に -fno-short-enums を付けることで両者の ABI を揃えています。(必須)

-fomit-frame-pointer

フレームポインタの退避/復旧コードの生成を省略し、追加のレジスタとして使用する最適化オプションです。exeGCC for SOLID の全てのバージョンの GCC/Clang は最適化オプション -O-O1 )以上はデフォルトで有効になるので明示的に指定する必要はありませんが、古いバージョンとの互換性とわかりやすさのために指定されています。

-O0

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

-O2

Release ビルド時に指定されます。ほぼ全ての一般的な最適化が有効になります。

-O, -O1, -O3, -Os

option:-O0 と option:-O2 の他にも段階的に -O1-O3 の最適化オプションが存在します。数字が大きいほど様々な最適化を行い、コンパイル時間が増大します。 -O-O1 は同じ意味です。 -O1 から -O3 は速度の最適化なのでバイナリサイズは増える場合があります。サイズの最適化を行う場合は -Os オプションを使用してください。

-g

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

-gdwarf-2, -gdwarf-3

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

-Wall

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

-Wextra

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

-w

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

ARM 専用オプション

-mlittle-endian

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

-marm

ARM コードを生成します。

-mthumb

Thumb コードを生成します。

-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 オプションでコンパイルしたコードとリンクすることはできません。

アセンブラオプション

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

リンカオプション

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