函数内联问题Function Inlining Problems

如果使用函数内联,则必须:If you are using function inlining, you must:

  • 已在包含的标头文件中实现的内联函数。Have the inline functions implemented in the header file you include.

  • 具有内联打开标头文件中。Have inlining turned ON in the header file.

// 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"); }

然后,And then,

// 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 或更高版本。If you are using the #pragma inline_depth compiler directive, make sure you have a value of 2 or greater set. 值为零将关闭内联。A value of zero will turn off inlining. 此外请确保你使用 /ob1/ob2编译器选项。Also make sure you are using the /Ob1 or /Ob2 compiler options.

混合使用不同的模块上的内联和非内联编译选项有时会导致问题。Mixing inline and non-inline compile options on different modules can sometimes cause problems. 如果使用函数内联开启创建 c + + 库 (/ob1/ob2),但相应的头文件描述函数具有内联关闭 (没有选项),你将收到错误 LNK2001。If a C++ library is created with function inlining turned on (/Ob1 or /Ob2) but the corresponding header file describing the functions has inlining turned off (no option), you will get error LNK2001. 函数执行不内联到代码从文件中获取标头,但由于它们不是库文件中没有地址来解析引用。The functions do not get inlined into the code from the header file, but since they are not in the library file there is no address to resolve the reference.

同样,使用函数内联的项目尚未定义的函数的.cpp 文件中而不是标头中,文件还将获得 LNK2019。Similarly, a project that uses function inlining yet defines the functions in a .cpp file rather than in the header file will also get LNK2019. 标头文件是包含无处不在认为合适,但函数才是内联在.cpp 文件中通过通过编译器;因此,链接器将函数视为未解析的外部对象时在其他模块中使用。The header file is included everywhere deemed appropriate, but the functions are only inlined when the .cpp file passes through the compiler; therefore, the linker sees the functions as unresolved externals when used in other modules.

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

然后and then,

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

然后and then,

// 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();
}

请参阅See Also

链接器工具错误 LNK2019Linker Tools Error LNK2019