Проблемы при встраивании функций
Если вы используете функцию встраивание, необходимо:
Есть встроенные функции, реализованные в файле заголовка, который вы включаете.
Встраивание включено в файле заголовка.
// 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();
}