1. UE_LOG와 로그 카테고리 선언
Unreal에서 커스텀 로그 카테고리를 사용할 때는 DECLARE_LOG_CATEGORY_EXTERN
과 DEFINE_LOG_CATEGORY
를 반드시 헤더/소스에 분리해서 작성해야 한다.
- 헤더 파일 (.h)
DECLARE_LOG_CATEGORY_EXTERN(LogSparta, Warning, All);
- 소스 파일 (.cpp)
DEFINE_LOG_CATEGORY(LogSparta);
2. UE_LOG 매크로 사용법
UE_LOG에서 문자열은 TEXT("문자열")로 반드시 감싸야 한다.
(오타로 Text("문자열")
로 쓰면 오류남)
UE_LOG(LogSparta, Error, TEXT("my Sparta!"));
3. BeginPlay 함수 구현 위치
클래스 선언부(.h)에서는 선언만 하고, 실제 구현은 .cpp 파일에서 클래스명::함수명 형태로 작성해야 한다.
헤더에서 직접 구현하거나, 중괄호를 같이 쓰면 링커 에러(LNK2019 등)가 발생할 수 있다.
// .h
virtual void BeginPlay() override;
// .cpp
void ATea_Cup::BeginPlay()
{
Super::BeginPlay();
UE_LOG(LogSparta, Error, TEXT("my Sparta!"));
}
4. 내가 겪은 실제 에러 원인
- 문제 상황:
클래스 생성자(생성자 함수) 안에 가상함수(override한 BeginPlay 등)의 정의를 넣어서 호출함.
즉, 생성자 중괄호 안에void ATea_Cup::BeginPlay() { ... }
를 직접 넣음. - 증상:
링커 오류(LNK2019, LNK2001), "함수 정의가 중복/잘못 선언" 같은 에러 발생 - 원인:
생성자 내부에는 생성자 코드만 들어가야 하고, 가상함수 정의는 클래스 바깥, .cpp 파일 최상위(전역)에서 별도로 구현해야 한다.
// 잘못된 예시 (생성자 중괄호 안에 함수 정의)
// ATea_Cup::ATea_Cup() {
// ...
// void ATea_Cup::BeginPlay() { ... } // <--- 멍청한 짓
// }
// 올바른 예시 (.cpp 파일 최상위에서 분리 구현)
void ATea_Cup::BeginPlay()
{
Super::BeginPlay();
UE_LOG(LogSparta, Error, TEXT("my Sparta!"));
}
5. 링커 에러 (LNK2019/LNK2001) 발생시 점검
- 함수 선언/정의 위치 확인 (생성자 중괄호 안에 다른 함수 정의가 들어가면 안 됨!)
- 매크로 오타/헤더 파일 include 여부 확인
- 빌드 꼬임 시
Binaries
,Intermediate
폴더 삭제 후 리빌드