이번글은 제가 Lyra프로젝트 클론코딩하다 UE_INLINE_GENERATED_CPP_BY_NAME 메크로안 매개변수를 잘 못 전달하여 LNK2005에러를 해결한 과정과 UE_INLINE_GENERATED_CPP_BY_NAME를 정리한 글입니다.
일단 해결한 방법은 ㄱ무식하게 작성했던 파일들을 노트패드에 다 복붙해두고 만들었던 파일 전부 다 삭제후 파일들을 다시 하나씩 만들어 빌드를 한단계씩 해나가며 원인을 찾아 해결하게 되었습니다.
원인은 LyraPawnComponent_CharacterParts.cpp .h, LyraControllerComponent_CharacterParts.cpp .h 이렇게 각각 4개씩 있고
각각의 .cpp파일 상단에
UE_INLINE_GENERATED_CPP_BY_NAME( LyraPawnComponent_CharacterParts )
UE_INLINE_GENERATED_CPP_BY_NAME( LyraControllerComponent_CharacterParts )
위처럼 해놓은 줄 알았는데 아래처럼 되있더 군요..
UE_INLINE_GENERATED_CPP_BY_NAME( LyraControllerComponent_CharacterParts )
UE_INLINE_GENERATED_CPP_BY_NAME( LyraControllerComponent_CharacterParts )
그럼 UE_INLINE_GENERATED_CPP_BY_NAME( LyraControllerComponent_CharacterParts )이렇게 두번했는데 왜 LNK2005에러가 발생했던 것이냐면...
LNK2005은 컴파일은 되었지만 링킹 과정에서 발생하는 링킹에러입니다.
여러개의 .cpp 또는 .h를 사용할 때 발생하는데요
[some.h]
int global_variable;
[some.cpp]
// blah~
위코드처럼 하나의 소스파일에서 include할 경우에는 링크 오류가 발생되지 않지만...
[some2.cpp]
// blah~
이런식으로 서로다른 소스파일에서 include하게 되면 컴파일은 되지만 링크단계에서 오류가 발생합니다.
캄파일을 하면서 생성되는 .obj 파일들을 묶어서 링킹하는데 some1.obj, some2.obj에 각각 같은 이름의 global_varialbe이라는 전역 변수가 있기 때문에 발생합니다.
해결하는 방법은 some.h의 전역변수를 extern으로 선언하고 정의를 some1.cpp에 해주면 됩니다.
아무튼 위와 같은 원인으로 클론코딩 하다 발생했는데요 UHT는 UObject 를 분석하여 .generated.h, .gen.cpp파일을 생성합니다.
UE_INLINE_GENERATED_CPP_BY_NAME는 컴파일 시간을 단축시켜주는 메크로 이구요
UE_INLINE_GENERATED_CPP_BY_NAME()는 안에 들어간 .gen.cpp파일을 해당클래스에 inline해주는 기능을 지원하여 컴파일러가 cpp파일들을 분석할 때 시간을 단축시켜줍니다.
UE_INLINE_GENERATED_CPP_BY_NAME( LyraControllerComponent_CharacterParts )이것을 두번 해주었기 때문에
.gen.cpp파일을 두번 inline하게 되어 LNK2005이 발생했던 것이구요...
정리하자면 정신 차리고 코드 똑바로 보면서 작성하자 입니다.
https://justknownlim.blogspot.com/2014/01/1.html
https://qiita.com/sentyaanko/items/5dd6a074718b261cce4b
'UE5' 카테고리의 다른 글
[UE] IsA (0) | 2024.01.20 |
---|---|
[UE] UObject::CreateUObject Delegate 바인딩 언제, 어디서, 왜 쓰는지 (0) | 2024.01.05 |
[UE] FObjectInitializer (1) | 2024.01.02 |
[UE] ArcheType (0) | 2023.12.31 |
[UE] GetOuter() (0) | 2023.12.24 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!