Поделиться через


Проблемы при встраивании функций

Если вы используете функцию встраивание, необходимо:

  • Есть встроенные функции, реализованные в файле заголовка, который вы включаете.

  • Встраивание включено в файле заголовка.

// 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 или более поздней версии. Значение нуля отключает встраивание. Также убедитесь, что вы используете параметры компилятора /Ob1 или /Ob2 .

Перемешивание встроенных и не встроенных параметров компиляции в разных модулях иногда может вызвать проблемы. Если библиотека C++ создана с включенной функцией (/Ob1 или /Ob2), но соответствующий файл заголовка, описывающий функции, отключен (без параметра), вы получите ошибку 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