All is well

[오늘의에러/UE] fatal error C1083: 포함 파일을 열 수 없습니다. 'Character/CCharacter.h': No such file or directory (헤더 파일과 소스 파일을 한 폴더에 담았을 때 소스 파일이 헤더 파일을 인식하지 못하는 경우) 본문

오늘의 에러

[오늘의에러/UE] fatal error C1083: 포함 파일을 열 수 없습니다. 'Character/CCharacter.h': No such file or directory (헤더 파일과 소스 파일을 한 폴더에 담았을 때 소스 파일이 헤더 파일을 인식하지 못하는 경우)

D0YUN 2025. 3. 16. 15:04

오늘의 에러

fatal error C1083: 포함 파일을 열 수 없습니다. 'Character/CCharacter.h': No such file or directory

클론 코딩하다가 소스 파일이 헤더 파일을 인식하지 못하는 에러를 만났다

 

 


 

에러 발생

CCharacter.cpp

언리얼에서 Player 역할을 할 `CCharacter` 파일을 생성하였다.

 

이때 Public, Private 폴더에 각각 헤더 파일과 소스 파일을 추가하는 것 대신 Character라는 폴더에서 한번에 관리하기 위해 Character 폴더 하위에 두 파일이 생성되도록 설정을 하였다.

 

같은 폴더 안에 있으면 당연하게 인식을 해야 하는데 소스 파일이 헤더 파일을 인식하지 못하여 당황스러웠다.

 

 


 

에러 원인

이 에러는 주로 `#include` 경로 문제에서 발생한다고 한다.

 

이 케이스는 Unreal Engine의 빌드 시스템이 `Character.h`와 `Character.cpp`가 들어 있는 Character 폴더의 경로를 제대로 인식하지 못해서 발생했다.

 

Unreal에서는 보통 `Source/프로젝트이름/` 아래 `Public`과 `Private` 폴더를 두고 관리하며, `Public`에 있는 헤더는 `#include "CCharacter.h"`처럼 단순 이름으로 접근하는 것이 일반적이다.

 

그런데 Character 폴더에 두 파일을 함께 담았을 경우 Unreal Engine의 Public 또는 Private 폴더 구조를 고려하지 않았기 때문에 제대로 인식하지 못하게 된다.

 

이를 인식시키기 위해서는 `CCharacter.h`가 있는 폴더를 `Build.cs` 파일에서 추가해서 Unreal Build System이 해당 파일을 찾을 수 있도록 해줘야 한다.

 

 

 


 

해결 방법

Odyssey.Build.cs

 

이 에러를 해결하려면 프로젝트의 `Build.cs` 파일에서 `PublicIncludePaths`에 올바른 헤더 경로를 추가해야 한다.

방법은 두 가지다

 

방법1

PublicIncludePaths.Add(ModuleDirectory);

 

 

이 방법을 이용하면 `ModuleDirectory`를 추가하여 `Source/Odyssey/` 전체를 포함할 수 있다.

 

  • `#include "CCharacter.h"`처럼 간략한 경로로 헤더를 포함할 수 있고
  • `Character` 폴더를 따로 지정하지 않아도 `ModuleDirectory` 아래에 있는 모든 헤더 파일을 검색할 수 있다.

 

방법2

PublicIncludePaths.Add(Path.Combine(ModuleDirectory, "Character"));

이 방법을 사용하면 `Character` 디렉터리만 포함 경로에 추가할 수 있다.

  • `Character` 폴더만 포함 경로에 추가되므로, 헤더 검색 범위를 최소화할 수 있고
  • 이를 통해 빌드 속도를 조금 더 최적화할 가능성이 생긴다.

 

 

모든 C++ 파일을 Public, Private을 나누지 않고 기능 별로 묶어 한 폴더에서 관리할 예정이라 방법1을 선택하였다.

 


추가 개념 정리

// PublicIncludePaths

  • Unreal Build System에서 헤더 파일을 검색하는 경로 목록이다.
  • 여기에 추가된 경로는 다른 모듈에서도 접근할 수 있는 `Public` 헤더 파일들의 포함 경로로 사용된다.
PublicIncludePaths.Add(ModuleDirectory);

위와 같이 설정하면, ModuleDirectory 내부의 모든 폴더가 검색 경로로 추가된다.

이를 통해 `#include "파일명.h" `형식으로 간략하게 불러올 수 있다.

 

// ModuleDirectory

`ModuleDirectory`는 현재 모듈의 루트 디렉터리 경로를 나타내는 문자열이다.

이 프로젝트의 구조를 빌려 설명하자면

Odyssey/
 ├── Source/
 │   ├── Odyssey/   (ModuleDirectory)
 │   │   ├── Character/
 │   │   │   ├── CCharacter.h
 │   │   │   ├── CCharacter.cpp

`ModuleDirectory` = `"Source/Odyssey"`
`PublicIncludePaths.Add(ModuleDirectory);`를 추가하면 `Source/Odyssey/` 내부의 모든 폴더에서 헤더를 찾을 수 있다.

#include "CCharacter.h"  // 정상적으로 인식 가능

 

 


 

 

해결완료