web-dev-qa-db-ja.com

インライン関数リンカーエラー

特定のクラスのインラインメンバー関数を使用しようとしています。たとえば、インライン化せずに関数を宣言して実装すると、次のようになります。

ヘッダーファイル内:

int GetTplLSize();

.cppファイル内:

int NeedleUSsim::GetTplLSize()
{
    return sampleDim[1];
}

何らかの理由で、実装と宣言のいずれか、および両方の場所に「inline」キーワードを配置すると、次のようなリンカーエラーが発生します。

ライブラリC:\ DOCUME〜1\STANLEY\LOCALS〜1\TEMP\MEX_HN〜1\templib.xとオブジェクトC:\ DOCUME〜1\STANLEY\LOCALS〜1\TEMP\MEX_HN〜1 \を作成していますtemplib.exp 
 mexfunction.obj:エラーLNK2019:未解決の外部シンボル "public:int __thiscall NeedleUSsim :: GetTplLSize(void)"(?GetTplLSize @ NeedleUSsim @@ QAEHXZ)関数_mexFunction 
 mexfunctionで参照.mexw32:致命的なエラーLNK1120:1つの未解決の外部
 
 C:\ PROGRA〜1\MATLAB\R2008B\BIN\MEX.PL:エラー:「mexfunction.mexw32」のリンクに失敗しました。 

このエラーを取り除くために何が必要ですか(つまり、これらのインラインメンバー関数を作成することに関して私が間違っていることは何ですか)?

27
stanigator

次に、関数定義をヘッダーに入れる必要があります。コンパイラにインライン化を促す最も簡単な方法は、次のようにクラス宣言にメソッド本体を含めることです。


class NeedleUSsim
{
  // ...
  int GetTplLSize() const { return sampleDim[1]; }
  // ...
};

または、個別の宣言と定義を主張する場合:


class NeedleUSsim
{
  // ...
  int GetTplLSize() const;
  // ...
};

inline int NeedleUSsim::GetTplLSize() const
{ return sampleDim[1]; }

定義は、そのメソッドを使用する各翻訳単位で表示される必要があります。

29

c ++からFAQ Lite

インライン関数の定義を.cppファイルに入れ、それが他の.cppファイルから呼び出された場合、リンカーから「未解決の外部」エラーが発生します。

メンバー関数をインラインにするようにコンパイラーにどのように指示しますか?

25
young

他の人がすでに指摘しているように、次のように、インライン関数の定義をヘッダーファイルに移動する必要があります。

class NeedleUSsim
{
  // ...
  inline int GetTplLSize() { return sampleDim[1]; }
  // ...
};

これは、コンパイラーがインライン化された関数の呼び出しを検出したときに、インライン化するコードを知る必要があるためです。関数の定義をNeedleUSsimクラスの.cppファイルに残すと、コンパイラがそのために生成するコードは、NeedleUSsimオブジェクトファイルにトラップされます。コンパイラはソースコードのみを読み取るため(別のクラスのオブジェクトファイルを覗き見することはありません)、別の.cppファイルをコンパイルするときに呼び出しを置き換えるコードを知る方法がありません。

5
Ken Dyck

インライン関数がある場合は、ヘッダーファイルに定義を配置する必要があります。

3
Stephen Nutt

インラインガードマクロイディオム を参照してください。これにより、少なくとも、コードを宣言から少しではありますが分離することができます。また、defineを介して関数のインライン化を切り替えることもできます。

0
grepsedawk