[UE4] C++로 PawnSensingComponent 추가하기

박지인·2021년 4월 28일
0

Unreal Engine 4

목록 보기
2/3

오류 발생

플레이어를 감지하면 플레이어를 뒤쫓아가는 AI를 만들기 위해 다음과 같은 C++ 코드를 작성하였다.

PawnSensing = CreateDefaultSubobject<UPawnSensingComponent>(TEXT("PawnSensing"));

그리고 컴파일을 하자 다음과 같은 오류가 발생하였다.

  Enemy.cpp.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) private: static class UClass * __cdecl UPawnSensingComponent::GetPrivateStaticClass(void)" (__imp_?GetPrivateStaticClass@UPawnSensingComponent@@CAPEAVUClass@@XZ) referenced in function "public: __cdecl AEnemy::AEnemy(void)" (??0AEnemy@@QEAA@XZ)

LNK2019 오류에 대한 Microsoft의 문서는 이 오류에 대하여 다음과 같이 설명하고 있다.

The compiled code for function makes a reference or call to symbol, but the linker can't find the symbol definition in any of the libraries or object files to link.
This error message is followed by fatal error LNK1120. To fix error LNK1120, you must fix all LNK2001 and LNK2019 errors first.
(한글)컴파일된 코드 함수 는 기호에 대 한 참조 또는 호출을 만들지만 링커가 연결할 라이브러리나 개체 파일에서 기호 정의를 찾을 수 없습니다.
이 오류 메시지 다음에 심각한 오류 LNK1120이 발생 합니다. 오류 LNK1120를 해결 하려면 먼저 모든 LNK2001 및 LNK2019 오류를 해결 해야 합니다.

error LNK2019?

C++ 코드의 컴파일 과정에 대한 간단한 설명
C++ 코드의 컴파일 과정에 대한 조금 더 자세한 설명

c++ 코드의 컴파일 과정에 대해서는 잘 설명된 글들이 많으니 간단히만 짚고 넘어가자. 우리가 작성한 c++ 코드는 실행 가능한 파일로 변환되기 위해서 4개의 도구를 거쳐간다.

1. C++ Preprocessor

2. Compiler

3. Assembler

4. Linker

LNK2019 오류를 대략 설명하자면, Linker가 어떤 호출된 함수의 정의를 Assembler가 생성한 object code에서 찾을 수 없을 경우 발생하는 오류이다. 해당 오류에는 수많은 발생 이유가 존재하지만, 결국은 무언가 정의해야 할 것을 빼먹었거나 잘못 정의했을 경우 발생하는 오류이다.

해결 방법

언리얼 엔진 공식 문서의 "언리얼 빌드 시스템 모듈 파일" 설명

사실 LNK2019의 발생 원인은 아주 다양하기에, 이 오류에 대한 딱 떨어지는 하나의 해답은 내놓을 수 없다. 발생 원인도, 그에 따른 해결 방법도 다양한 정말 케이스 바이 케이스인 오류이기 때문이다. 어찌 되었든 나의 경우엔 다음과 같은 방법으로 문제를 해결할 수 있었다.

ProjectName.Build.cs의 PublicDependencyModuleNames.AddRange 함수에 "AIModule"을 추가한다!

PublicDependencyModuleNames에 대한 공식 문서의 설명은 다음과 같다.

PublicDependencyModuleNames (List)
(경로 없이) 퍼블릭 디펜던시 모듈 이름 목록입니다 (private/public 인클루드는 자동으로 합니다). 공용 소스 파일에 필요한 모듈입니다.

PawnSensingComponent는 AIModule에 속해있는 Component이다. 그렇기에 해당 Module을 사용하기 위해 "AIModule"을 PublicDependencyModuleNames에 추가해야만 한다.

1개의 댓글

comment-user-thumbnail
2023년 4월 13일

정말 감사합니다 사랑합니다. 방금 한명의 목숨을 구하셨습니다 복받으세요ㅠㅠㅠ

답글 달기