「スタブ設定」の機能でスタブ関数を作成し、スタブのソースファイルを開発環境でビルド、リンクしましたが、シミュレータでテスト実行中にエラーとなってしまいます。(※関数、変数シンボルが存在しない等のエラーが発生)考えられる原因を教えてください。
よくある質問(FAQ)
「スタブ設定」の機能でスタブ関数を作成し、スタブのソースファイルを開発環境でビルド、リンクしましたが、シミュレータでテスト実行中にエラーとなってしまいます。(※関数、変数シンボルが存在しない等のエラーが発生)考えられる原因を教えてください。
コンパイル&リンクした「スタブ関数」が実行オブジェクトファイルに入っていないことが考えられます。以下の原因が考えられます。
「カバレッジマスターwinAMS」で生成したスタブソースファイルの先頭には、スタブソース全体を囲む「#ifdef WINAMS_STUB」 が入っています。開発環境のプリプロセッサ設定で「WINAMS_STUB」 が設定 (例 : -DWINAMS_STUB) されていない場合は、スタブソースファイルはコンパイルの対象になりません。必ず設定してください。
カバレッジマスターで生成したスタブ関数は、アプリケーションのどこからも呼ばれない孤立した関数となっています。このため、コンパイラやリンカの最適化によっては、スタブ関数が未使用関数として認識され、リンクされずオブジェクトファイルに含まれないことがあります。この場合は、スタブソース内にスタブ関数をリンクさせるためのダミーコードが必要となります。
コンパイラ/リンカの仕様に依存しますが、一般的には、スタブ関数の関数ポインタ配列をvolatile宣言によりグローバル領域に作成して置くことで、その関数はリンクの対象となります。
例えば、スタブ関数 AMSTB_func1、AMSTB_func2, AMSTB_func3 がある場合には、スタブソースファイルの最後に、
volatile int (*dummyfunc[])() = { AMSTB_func1, AMSTB_func2, AMSTB_func3 };
を追加することで対応可能です。
IAR社製のコンパイラをご利用の場合、「__root」キーワードによって問題を回避できる可能性があります。具体的には
__root int AMSTB_func1(int arg0)
{ ...
}
のように、スタブ関数の先頭に「__root」を付加します。