평소처럼 Rider의 자동완성 기능을 통해 UInterface를 생성하고 이 UInterface를 다른 모듈의 코드에서 캐스팅하는 작업을 수행하였다.
#pragma once
#include "CoreMinimal.h"
#include "UObject/Interface.h"
#include "DefaultAI.generated.h"
UINTERFACE()
class UDefaultAI : public UInterface
{
GENERATED_BODY()
};
class AI_API IDefaultAI
{
GENERATED_BODY()
public:
virtual class AAIController* GetAIController() const = 0;
};
하지만, 이후 컴파일을 진행하자 다른 모듈의 코드에서 해당 인터페이스로 캐스팅을 수행할 때 컴파일은 완료 되었으나, 아래와 같이 LNK1120 에러가 발생하였다. 모듈간의 관계 설정이 완료된 상태에서도 이와 같은 에러가 발생하였다.
unresolved external symbol "private: static class UClass * __cdecl UDefaultAI::GetPrivateStaticClass(void)" (?GetPrivateStaticClass@UDefaultAI@@CAPEAVUClass@@XZ) referenced in function "public: virtual void __cdecl UAIDataProvider_Distance::BindData(class UObject const &,int)" (?BindData@UAIDataProvider_Distance@@UEAAXAEBVUObject@@H@Z)
UE4Editor-LF-Win64-DebugGame.dll: [LNK1120] 1 unresolved externals
Microsoft.MakeFile.targets(44, 5): [MSB3073] ""C:\Users\Jihun Jeon\Documents\4.26.2\Engine\Build\BatchFiles\Build.bat" LFEditor Win64 DebugGame -Project="C:\Users\Jihun Jeon\Documents\notd\LF.uproject" -WaitMutex -FromMsBuild" 명령이 종료되었습니다(코드: 6).
아래와 같이 UInterface 부분에도 소속된 모듈(여기선 AI_API)을 기입하면 문제가 해결된다.
#pragma once
#include "CoreMinimal.h"
#include "UObject/Interface.h"
#include "DefaultAI.generated.h"
UINTERFACE()
class AI_API UDefaultAI : public UInterface
{
GENERATED_BODY()
};
class AI_API IDefaultAI
{
GENERATED_BODY()
public:
virtual class AAIController* GetAIController() const = 0;
};
주요 문제점은 Rider의 자동완성 기능을 활용한 경우, 다른 클래스들과 달리 CPP 인터페이스와 UInterface 코드가 각각 생기는 UInterface는 DLL Export를 위한 매크로(여기선 AI_API)를 실제 CPP 인터페이스쪽 코드에만 붙여줘서 생긴 문제인 것 같다.