関数インライン展開の問題

関数のインライン展開を使用している場合は、次の条件を実行する必要があります:

  • インクルードするヘッダー ファイルにインライン関数を実装します。

  • ヘッダー ファイルで、インライン展開をオンにします。

// LNK2019_function_inline.cpp
// compile with: /c
// post-build command: lib LNK2019_function_inline.obj
#include <stdio.h>
struct _load_config_used {
   void Test();
   void Test2() { printf("in Test2\n"); }
};

void _load_config_used::Test() { printf("in Test\n"); }

そして、

// LNK2019_function_inline_2.cpp
// compile with: LNK2019_function_inline.lib
struct _load_config_used {
   void Test();
   void Test2();
};

int main() {
   _load_config_used x;
   x.Test();
   x.Test2();   // LNK2019
}

#pragma inline_depth のコンパイラ ディレクティブを使用している場合は、値が 2 以上のセットを持っている必要があります。 値が 0 の場合、インライン展開はオフになります。 また、/Ob1 または /Ob2 コンパイラ オプションを使用する必要があります。

異なるモジュールでインライン コンパイル オプションと非インライン コンパイル オプションを混在すると、問題が発生する可能性があります。 関数のインライン化をオン (/Ob1 または /Ob2) にして C++ ライブラリを作成しても、その関数を記述した対応するヘッダー ファイルのインライン化がオフ (オプションなし) になっていると、エラー LNK2001 が発生します。 関数は、ヘッダー ファイルからコードにインライン化されていませんが、ライブラリ ファイルにはないので、参照を解決するためのアドレスはありません。

同様に、関数のインライン化を使用していても、その関数をヘッダー ファイルではなく .cpp ファイルに定義しているプロジェクトも、LNK2019 が取得されます。 ヘッダーファイルは適切な場所にインクルードされますが、関数は .cpp ファイルがコンパイラを通過する場合だけインライン化されます。そのためリンカーは、他のモジュールで使用されている場合、未解決の外部関数と見なします。

// LNK2019_FIP.h
struct testclass {
   void PublicStatMemFunc1(void);
};

この場合、次のようになります、

// LNK2019_FIP.cpp
// compile with: /c
#include "LNK2019_FIP.h"
inline void testclass::PublicStatMemFunc1(void) {}

この場合、次のようになります、

// LNK2019_FIP_2.cpp
// compile with: LNK2019_FIP.cpp
// LNK2019 expected
#include "LNK2019_FIP.h"
int main() {
   testclass testclsObject;

   // module cannot see the implementation of PublicStatMemFunc1
   testclsObject.PublicStatMemFunc1();
}

関連項目

リンカー ツール エラー LNK2019