インライン関数で発生するundefined external エラーの対処
テクニカル・ノート 49981
アーキテクチャ:
All
コンポーネント:
compiler
更新日:
2018/01/23 9:33
はじめに
リンカエラーがインライン関数を持つCソースファイルに対して発行されることがあります。エラーメッセージは次のとおりです:
- Error[e46]: Undefined external ... (from XLINK)
- Error[Li005]: no definition for ... (from ILINK)
このテクニカルノートでは、このような状況を解決する方法について説明します。
解説
コンパイラがいくつかの基本条件(インライン関数用)を満たすことができないため、リンカエラーが発行されます。つまり、以下の点を確認し、それに応じてCソースを変更してください:
- コンパイラは、コンパイル時にインライン関数の定義を '参照'できなければならない
- インライン関数が明確に1つの.cファイルのみ使用される場合は、定義をその.cファイルに移動します
- 複数の.cファイルで共通のインライン関数を使用するには: 1 関数定義を.h fileに置きます。
// To be present in a .h file (for example foo.h),
// typically included by many .c files.
inline unsigned char foo(unsigned char c)
{
return (c+1);
}
- 2 この関数の呼び出しがあるすべての.cファイルにこの.hファイルを含めます。
- 3 インライン関数のextern宣言を含む1つの.cファイルが明確に存在することを確認します。
// To be present in precisely one (1) .c file
// (for example foo.c)
extern inline unsigned char foo(unsigned char c);
1と2の理由は簡単ですが3の理由は理解しにくいかもしれません。ISO standard for C より: '...An inline definition does not provide an external definition for the function...' そのため、関数への非インラインからの参照を解決するためにextern宣言が(リンカによって)使用されます。
まとめ
インライン関数を含むC コード には、いくつかの制約があります。 例えば、インライン関数が static シンボル(変数あるいは関数)を参照していないことを確認してください。
詳細については、開発ガイド あるいは コンパイラリファレンスガイドのインライン関数 章を参照してください。
全ての製品名は、それぞれの所有者の商標または登録商標です