인프런 커뮤니티 질문&답변

SIsB님의 프로필 이미지
SIsB

작성한 질문수

이득우의 언리얼 프로그래밍 Part1 - 언리얼 C++의 이해

빌드 시스템에 대해 이해가 되지 않는 부분이 있어 여쭤봅니다

작성

·

483

·

수정됨

0

Build.cs 파일에 PublicDependencyModuleNames 와 PrivateDependencyModuleNames 의 차이를 공홈에서 처럼 Public 폴더의 헤더(보통의 경우) 에서 참조하는 경우는 PublicDependencyModuleNames 를 사용하라 하는데요 이렇게 사용하면 안 좋다는 것을 알지만 PrivateDependencyModulesNames 에 추가해도 컴파일은 제대로 되다보니 이해가 안됩니다 ㅠ

예를 들면)

ModuleA

  • Public

    -> ObjectA.h

ModuleB

  • Public

    -> ObjectB.h

ModuleB.build.cs 의 PrivateDependencyModuleNames에 ModuleA 를 추가하더라도 ObjectB.h 에서 ObjectA 이 사용 가능한 상황입니다.

알려주세요 ㅠ

 

답변 1

1

이득우님의 프로필 이미지
이득우
지식공유자

네 언리얼 엔진의 모듈 구조는 넓게 세 개의 모듈 사이의 관계로 이해하시면 될 것 같아요. 두 개의 모듈 구조에서는 문의주신 것처럼 차이가 없습니다.
A모듈(엔진) - B모듈(플러그인) - C모듈(게임) 이라는 관계로 세 모듈이 연결되어 있다고 가정하겠습니다. 엔진 모듈 A가 최상단모듈이 되겠지요?

시나리오1) C모듈이 B모듈을 Public으로 설정하면 A모듈의 헤더 경로를 자동으로 얻어올 수 있습니다. 하지만 소스코드 링킹은 실패합니다.
시나리오2) C모듈이 B모듈을 Private로 설정하면 A모듈의 헤더 경로도 얻어올 수 없습니다. 소스코드 링킹도 실패하고요.

정리하면,
C모듈이 A모듈의 소스코드를 링크하기 위해서는 A모듈을 직접 참조해야 합니다. B를 통해서는 링크는 어떤 경우든 불가능합니다. 따라서 이런 경우에는 Public/Private 구조가 큰 의미 없습니다.
C모듈이 B모듈을 퍼블릭하게 참조하면 A모듈의 퍼블릭폴더 내 헤더파일은 가져올 수 있기 때문에, definition정도는 얻어온다는 편리함이 추가될 것 같네요.
사실 우리는 대부분 C아니면 가끔 B에서 작업하므로 이런 설계에 큰 고민을 하지 않아도 됩니다. A를 작업하는 사람은 헤더를 Public에 넣느냐, Private에 넣느냐에 따라 이후 모듈들이 참조하는 헤더에 영향을 주기때문에 가급적이면 외부에 노출할 필요 없는 모듈은 Private에 넣는것이 좋습니다.

SIsB님의 프로필 이미지
SIsB
질문자

감사합니다!

SIsB님의 프로필 이미지
SIsB

작성한 질문수

질문하기