[C++20 모듈과 IOCP로 완성하는 MMORPG 서버] 1. 환경설정

MIN·2025년 8월 6일
0

C++20 & IOCP

목록 보기
1/5

깃허브 주소 : CPP20_GameServer

이번 글들은 완성된 결과물을 설명하는 것보다는, 제가 이것을 만들어가는 과정에서 마주쳤던 문제들과 그에 대한 저의 고민을 정리한 회고록이라고 생각해주시면 좋을 것 같습니다.

여기서 저는 C++20의 문법과 기술을 활용해서 게임 서버를 만들었다고 말씀드릴 수 있을 것 같아요.
물론 제가 한 방식이 완벽하지 않을 수도 있고, 더 좋은 방법이 분명히 있을 겁니다.
하지만 이 분야에 도전하는 분들께 조금이라도 도움이 되고 싶어서, 저의 경험을 바탕으로 블로그를 작성하게 되었습니다.

환경설정

앞으로 다룰 내용들은 Rookiss님의 강의를 기반으로 하되, C++20으로 변경하면서 새롭게 적용한 부분들만 중심적으로 다룰 예정입니다.
전체적인 내용이 궁금하신 분들은 아래 링크를 참고하시면 더 자세히 볼 수 있을 거예요.

CorePch 모듈화

저희는 앞으로 모듈을 적극적으로 활용할 것이기 때문에, 모든 프로젝트의 언어 표준을 C++20으로 맞춰주셔야 합니다.
그리고 앞으로를 생각하면 C 언어 관련 코드도 모두 최신 버전으로 관리하는 게 좋겠죠.

위와 같이 프로젝트 속성에서 언어 표준을 C++20으로 지정해주시면 됩니다.

원래 CorePch는 헤더 파일 하나와 구현 파일 하나로 구성되어 있습니다.
하지만 이번에는 모듈 인터페이스 파일을 사용해서, 헤더의 역할을 대신할 모듈 파일을 새로 만들어 사용했습니다.

이처럼 CorePch의 모듈 인터페이스 파일을 만들어주고,
HelloServer의 정의는 CorePch의 구현 파일에서 따로 구현해줍니다.

이렇게 하면 모듈로도 기존의 헤더-구현 구조와 비슷하게 나눠서 사용할 수 있습니다.
그리고 Types 역시 모듈화하여 다음과 같이 구현할 수 있습니다.

여기까지는 비교적 순조롭게 진행됐습니다.
하지만 이 다음부터는 설계상에서 고민할 만한 부분들이 하나둘 생기기 시작했습니다.

모듈 vs 미리 컴파일된 헤더(PCH)

모듈을 사용할 때는 절대로 미리 컴파일된 헤더(PCH) 기능을 사용하면 안 됩니다.
C++20 모듈과 PCH는 구조가 완전히 다르기 때문에, 둘을 같이 쓰려고 하면 컴파일러에서 에러가 발생합니다.

그래서 앞으로는 PCH 기능을 모듈로 대체할지, 아니면 아예 없앨지에 대해 고민해야 했습니다.
결국 저는 각 프로젝트별로 사용할 PCH를 모듈로 따로 만들고, 거기에 편의성 기능(매크로, 기능함수)을 헤더 파일에 담는 방향을 잡았습니다.

지금까지 설명드린 내용들은 ServerCore 기준이고,
전체 프로젝트 구조는 아래와 같습니다.

여기까지는 사실 큰 어려움이 없습니다.
모듈 개념만 이해하면 비교적 쉽게 만들 수 있으니까요.
하지만 진짜 문제는 이제부터입니다.

모듈 환경에서의 빌드 설정

원래 GameServer를 구현할 때는 미리 컴파일된 헤더를 사용하고,
프로젝트 속성에서 각종 라이브러리 경로를 직접 지정해야 했습니다.
모듈을 도입해도 비슷한 작업이 필요하지만,
이제는 예전보다 더 신경 써야 할 부분이 많아졌습니다.

저는 크게 네 가지 작업을 진행했습니다.

1. 공용 C++ 모듈 디렉터리 경로 지정
참조하는 모듈을 사용하려면, 사용하려는 모듈의 .ifc 파일 경로를 추가해야 합니다.
저는 아래와 같은 경로로 지정했습니다.

$(SolutionDir)ServerCore\x64$(Configuration)\

  1. 링커 입력 - 추가 종속성
    가져오고 싶은 프로젝트의 lib 파일을 추가해야 합니다.
    이 파일이 있어야 링커가 빌드 타겟과 연결할 수 있습니다.

    ServerCore.lib

  1. 링커 일반 - 추가 라이브러리 디렉터리
    ServerCore가 빌드된 파일 경로를 추가해주면 됩니다.

    $(SolutionDir)Libraries$(Configuration)\

  2. 참조 추가
    참조 추가는, 빌드 전에 의존하는 프로젝트를 먼저 빌드하게끔 해주는 기능입니다.
    아래처럼 참조할 프로젝트를 체크해주면 됩니다.


    이렇게 하면 환경 설정은 마무리됩니다.
    DummyClient도 똑같이 설정해주면 모든 준비가 끝납니다.

GameServer의 Pch 만들기

이제 GameServer만의 Pch를 만들어야 하는데,
여기서 주의할 점은 ServerCore와 다른 이름으로 Pch 파일을 만들어야 한다는 점입니다.

만약 동일한 이름을 쓰면,
ServerCore를 참조하면서 이름이 겹쳐서 빌드 오류가 발생할 수 있습니다.

따라서 GameServer만의 Pch 파일을 따로 만들어주고,
여기서 ServerCore의 CorePch를 import해주면
이제 GameServer의 구현 파일에서 이 Pch 파일만 import해 모든 기능을 사용할 수 있습니다.

이렇게 해서 결국 첫 모듈화에 성공했습니다.

마지막으로, 환경설정이 모두 끝난 프로젝트의 모습을 보여드리면서
이 글을 마무리하겠습니다.

참고

Inflearn [Rookiss] [[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버]

profile
게임개발자(진)

0개의 댓글