1. 서버 프로젝트의 기본 구조

📌 게임 서버는 세 개의 주요 모듈로 구성됩니다.

GameServer/            -> 게임 서버 실행 파일
Client (Dummy)/        -> 테스트용 클라이언트
ServerCore/            -> 서버의 핵심 기능을 담은 정적 라이브러리 (.lib)

각 프로젝트 역할

프로젝트설명
GameServer서버 실행 프로그램, ServerCore 라이브러리를 사용
Client (Dummy)더미 클라이언트, 서버와의 네트워크 테스트 용도
ServerCore서버의 핵심 기능이 포함된 정적 라이브러리 (.lib), GameServer 및 Client에서 참조하여 사용

📌 목표

  • ServerCore정적 라이브러리(.lib) 로 만들어서 GameServer와 DummyClient에서 공용으로 사용하도록 구성합니다.

2. 정적 라이브러리 vs 동적 라이브러리

C++에서는 라이브러리를 크게 정적 라이브러리(.lib)동적 라이브러리(.dll) 로 구분합니다.

1) 정적 라이브러리 (Static Library, .lib)

  • 빌드할 때 실행 파일에 포함되므로, 배포 시 추가적인 관리가 필요 없음.
  • 실행 시 라이브러리 전체가 메모리에 로드되므로 메모리 낭비 가능성이 있음.
  • 실행 속도가 빠르지만, 프로그램 크기가 커질 수 있음.

📌 장점

  • 배포가 간편 (라이브러리를 별도로 배포할 필요 없음).
  • 실행 속도가 빠름 (라이브러리를 미리 링크하여 사용).

📌 단점

  • 실행 파일 크기가 커짐.
  • 라이브러리를 변경할 경우 실행 파일을 다시 빌드해야 함.

2) 동적 라이브러리 (Dynamic Library, .dll)

  • 실행 파일과 별도의 파일로 존재하며, 프로그램 실행 시 로드됨.
  • 여러 개의 프로그램이 같은 .dll 파일을 공유하여 사용 가능.
  • 메모리 사용량이 줄어들지만, 실행 속도가 상대적으로 느릴 수 있음.

📌 장점

  • 여러 프로그램에서 같은 .dll을 공유할 수 있어 메모리 절약 가능.
  • 라이브러리를 수정해도 실행 파일을 다시 빌드할 필요 없음.

📌 단점

  • .dll 파일을 별도로 관리해야 함.
  • 실행 속도가 다소 느려질 수 있음 (추가적인 로딩 시간이 필요).

📌 서버 프로젝트에서 선택한 방식

  • ServerCore는 정적 라이브러리(.lib)로 제작하여 GameServerClient에서 링크하여 사용.

3. 프로젝트 생성 및 디렉터리 구조 정리

📌 새로운 프로젝트 생성
1. Visual Studio에서 새로운 솔루션 생성

  • GameServer (콘솔 앱)
  • DummyClient (콘솔 앱)
  • ServerCore (정적 라이브러리)
  1. 솔루션 폴더 정리

    • Binary/ → 실행 결과물 저장
    • Libraries/ → 정적 라이브러리(.lib) 저장
      • Debug/
      • Release/
  2. 각 프로젝트의 폴더 정리

    • ServerCore/ 내부
      • Network/
      • Utils/
    • GameServer/
      • Main/
      • Utils/
    • DummyClient/
      • Main/
      • Utils/

📌 디렉터리 구조

Server/
│── Binary/
│── Libraries/
│    ├── Debug/
│    ├── Release/
│── ServerCore/
│    ├── Network/
│    ├── Utils/
│── GameServer/
│    ├── Main/
│    ├── Utils/
│── DummyClient/
│    ├── Main/
│    ├── Utils/

4. ServerCore 프로젝트 설정

📌 출력 디렉터리 변경 (정적 라이브러리 .lib 생성)
1. ServerCore 우클릭 → 속성일반
2. 출력 디렉터리 변경

$(SolutionDir)Libraries\$(Configuration)\
  1. 빌드 후 Libraries/Debug/ServerCore.lib 또는 Libraries/Release/ServerCore.lib 에 생성됨.

5. Precompiled Header (PCH) 설정

📌 PCH (Precompiled Header)란?

  • 자주 사용하는 헤더 파일을 미리 컴파일하여 빌드 속도를 개선하는 기능.

📌 ServerCore에서 PCH 설정

📁 ServerCore/pch.h

#pragma once
#define WIN32_LEAN_AND_MEAN  // 불필요한 Windows 헤더 제외
#include "CorePch.h"

📁 ServerCore/CorePch.h

#pragma once

#include "Types.h"
#include <vector>
#include <list>
#include <queue>
#include <map>
#include <set>
#include <unordered_map>
#include <iostream>

using namespace std;

void HelloWorld();

📁 ServerCore/CorePch.cpp

#include "pch.h"
#include "CorePch.h"

void HelloWorld() {
    cout << "Hello Server!" << endl;
}

📌 GameServer, DummyClient에서도 PCH 설정
1. pch.h 생성 후 CorePch.h 포함.
2. C/C++ > 미리 컴파일된 헤더 옵션 활성화.


6. 라이브러리 링크 설정

📌 GameServer에서 ServerCore.lib 사용하도록 설정
1. VC++ 디렉터리에서 포함 디렉터리 및 라이브러리 디렉터리 추가

$(SolutionDir)ServerCore\
$(SolutionDir)Libraries\
  1. 링커 > 입력 > 추가 종속성ServerCore.lib 추가.

또는 자동으로 라이브러리 링크

#ifdef _DEBUG
#pragma comment(lib, "Debug\\ServerCore.lib")
#else
#pragma comment(lib, "Release\\ServerCore.lib")
#endif

7. GameServer 및 DummyClient 빌드 및 실행

📌 GameServer 실행 테스트

#include "pch.h"
#include <iostream>

int main()
{
    HelloWorld();  // ServerCore의 라이브러리 함수 호출
}

📌 DummyClient도 동일하게 설정
1. VC++ 디렉터리에서 포함 및 라이브러리 디렉터리 설정.
2. ServerCore.lib 링크 후 HelloWorld(); 호출.

📌 빌드 후 Binary/Debug/ 폴더에서 실행

Hello Server!

profile
李家네_공부방

0개의 댓글