함수 인라이닝 문제
함수 인라인을 사용하는 경우 다음을 수행해야 합니다.
포함하는 헤더 파일에 인라인 함수를 구현합니다.
헤더 파일에서 인라인을 켜야 합니다.
// 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();
}