インライン関数で発生する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 シンボル(変数あるいは関数)を参照していないことを確認してください。

詳細については、開発ガイド あるいは コンパイラリファレンスガイドインライン関数 章を参照してください。

全ての製品名は、それぞれの所有者の商標または登録商標です

申し訳ございませんが、弊社サイトではInternet Explorerをサポートしていません。サイトをより快適にご利用いただくために、Chrome、Edge、Firefoxなどの最新ブラウザをお使いいただきますようお願いいたします。