개발환경 (C++): Linux + Visual Studio 2019 원격 개발

아이펀 엔진은 Visual StudioLinux Development with C++ 기능을 사용해서 아이펀 엔진으로 생성한 C++ 프로젝트를 원격으로 개발 할 수 있도록 지원합니다. 이 기능은 Visual Studio 2019 이후부터 지원합니다.

이로써 여러분은 MS Windows 에서 익숙한 Visual Studio 를 이용해서 Linux 에서 동작하는 아이펀 엔진 게임 서버를 개발할 수 있습니다.

Note

Visual StudioWindows 에서 동작하는 아이펀 엔진 게임 서버를 개발하는 방법은 개발환경(C++): Windows + Visual Studio 를 참고해주세요.

Note

Visual Studio CodeVisual StudioMicrosoft 의 서로 다른 제품입니다. Visual Studio Code 를 이용해서도 원격의 Linux 서버에서 동작하는 아이펀 엔진 게임 서버를 만들 수 있습니다. 자세한 내용은 개발환경 (C++/C#): Linux + Visual Studio Code 원격 개발 를 참고해주세요.

Note

Visual Studio Code 는 로컬 호스트 (즉, 개발자의 Windows 컴퓨터) 에는 프로젝트를 생성하지 않고 원격의 Linux 호스트에 직접 코드를 생성하고 이를 접근합니다. 그러나 Visual Sutido 는 같은 Microsoft 의 제품임에도 이와는 달리 로컬 호스트에 프로젝트를 생성하고 서버를 빌드하거나 실행할 때 원격의 `Linux` 서버에 소스를 복사하는 방식 으로 동작합니다.

Visual Studio 에 원격 Linux 개발 기능 추가하기

본 설명은 Visual StudioC++를 사용한 Linux 개발 기능을 활용합니다. 만일 설치되어있지 않다면 아래 설명을 따라하시기 바랍니다.

  1. Visual Studio Installer 를 실행합니다.

  2. 설치되어있는 Visual Studio 종류를 선택하고 수정 버튼을 누릅니다. (예를 들면, Visual Studio 2019 Community)

  3. 워크로드 항목에서 C++를 사용한 Linux 개발 을 선택합니다.

  4. 다이얼로그 하단의 수정 버튼을 누릅니다.

_images/vs_remote_vs_configuration.png

빌드 및 실행을 하게 될 원격 호스트 설정

  1. Visual Studio 메뉴에서 도구 > 옵션 메뉴를 열고, 설정 창에서 플랫폼 > 연결 관리자 를 선택합니다.

_images/vs_remote_connection_manager1.png
  1. 여기서 추가 버튼을 누르면 아래와 같은 창이 뜨면서 접속할 원격 리눅스 호스트의 정보를 입력할 수 있습니다.

  • 호스트 이름: 서버의 DNS 이름이나 IP 주소를 입력할 수 있습니다.

  • 포트: 리눅스 호스트의 SSH 서버가 사용하는 포트를 입력합니다. (기본값: 22)

  • 사용자 이름: 리눅스 호스트 인증에 사용할 사용자 이름을 입력해 주세요. 미리 생성자되어 있어야 합니다.

  • 인증 형식은 SSH 연결에서 사용하는 두 가지 인증 방법인 아이디/비밀번호를 사용하는 암호 방식과 인증 파일을 사용하는 프라이빗키 방식 중 하나를 선택할 수 있습니다. 이는 원격의 리눅스의 설정에 따라 다르므로 자신이 사용할 리눅스 호스트에 맞게 설정합니다.

_images/vs_remote_connection_manager2.png

Note

리눅스 운영체제를 사용할 때, 권한 설정의 번거로움을 해결하기 위하여 관리자(root) 권한의 계정을 사용하는 경우가 있습니다. 그러나, 리눅스는 보안상의 이유로 관리자 계정의 원격 접속을 권장하지 않기 때문에 일반 계정으로 접속해 주시기 바랍니다.

  1. SSH 로 원격 시스템에 연결할 수 있는 경우 아래처럼 원격 서버가 추가된 것을 알 수 있습니다.

_images/vs_remote_connection_manager3.png

Visual Studio 확장 프로그램 설치하기

Visual Studio 확장 프로그램 을 설치합니다. 해당 확장 프로그램은 Visual Studio 를 이용해서 아이펀 엔진 게임 서버를 개발하는데 필요합니다.

Visual Studio 에서 프로젝트 생성하기

  1. 앞에서 Visual Studio 확장 프로그램을 설치했다면, 이제 Visual Studio 메뉴에서 새로 만들기 > 프로젝트 를 선택할 때 아이펀 엔진 프로젝트를 선택할 수 있게 됩니다. 아이펀 엔진의 윈도우 Native 프로젝트 템플릿과 리모트 리눅스 호스트에서 개발하기 위한 템플릿 두 가지가 있습니다. 본 문서에서는 후자를 다루고 있기 때문에 반드시 iFun Engine Project (Linux) 로 되어있는 것을 선택하셔야 됩니다.

_images/vs_remote_new_project1.png
  1. 프로젝트 이름과 저장 위치를 지정합니다.

_images/vs_remote_new_project2.png

Important

프로젝트 이름과 위치에 공백이 포함되어 있으면 Visual Studio 가 오동작합니다.

Note

솔루션 프로젝트를 같은 디렉터리에 배치 를 끄게 되면 솔루션 디렉터리 밑에 프로젝트 이름의 하위 디렉터리를 생성하고 거기에 파일을 저장하게 됩니다.

  1. 지정된 위치에 새 프로젝트가 생성됩니다. 다만 Visual Studio 에서 제공하는 확장프로그램 인터페이스의 기술적 문제로 자동으로 프로젝트를 열어주지는 못합니다. 그때문에 아래와 같은 메시지를 보시게 될 겁니다. 생성된 프로젝트를 다시 한번 열어야 하는 점을 기억하시고 확인 버튼을 누릅니다.

_images/vs_remote_new_project3.png
  1. 비어있는 Visual Studio 가 뜨게 되면 메뉴에서 파일 > 열기 > 플더 메뉴를 선택해서 조금전 지정한 저장위치를 엽니다. 이 때 .vs 폴더가 있는 폴더에서 폴더 선택 을 누르셔야 됩니다.

_images/vs_remote_new_project4.png
  1. 솔루션 탐색기 에 다음과 같이 표시되면 성공적으로 프로젝트를 만든 것입니다.

_images/vs_remote_new_project5.png
  1. 폴더를 열면 Visual Studio 가 자동으로 원격의 리눅스에 소스를 복사하고 cmake 를 실행하게 됩니다.

_images/vs_remote_new_project6.png

Important

Visual Studio 는 원격 Linux 에서 cmake 를 이용한 개발 기능을 위해 cmake 3.8 이상의 버전을 필요로 합니다. 사용하는 리눅스에 설치된 cmake 가 이 조건을 만족하지 못할 수 있습니다. 이런 경우 아래와 같은 오류 메시지가 출력됩니다.

_images/vs_remote_cmake_error1.png

이 때에는 Visual Studio 의 상단 표시줄에 아래처럼 cmake 설치 여부를 묻는 상태줄에서 를 선택해주면 됩니다.

_images/vs_remote_cmake_error2.png

Tip

프로젝트를 만드신 후 해당 프로젝트를 소스 저장소에 넣으시면 됩니다. 이때 out 이라는 디렉터리는 Visual Studio 가 자동 생성하는 디렉터리이니 소스 저장소에 넣지 마세요.

Tip

지금 만들어진 프로젝트는 원격 리눅스에 옮겨져서 빌드되는 완전한 소스 파일입니다. 다시 말해 개발팀 내에 Windows 를 쓰지 않고 직접 Linux 에서 개발하는 사람이 있을 경우에도 소스코드를 공유할 수 있다는 것을 의미합니다.

Tip

만일 연결 관리자 에 여러개의 원격 연결이 지정된 경우, Visual Studio 는 임의로 원격 호스트를 선택합니다. 이 경우 명시적으로 원격 호스트를 지정하고 싶으신 경우 CMakeSettings.json 파일을 열고, 원격 머신 이름 에 나오는 리스트에서 원하는 호스트를 선택하면 됩니다.

_images/vs_remote_connection_manager4.png

소스 빌드하기

Visual Studio 는 자동으로 원격의 Linux 서버에서 cmake 를 실행합니다. 이 과정이 모두 종료되어야만 빌드 메뉴아래 모두 빌드 같은 기능들이 활성화됩니다.

빌드 를 선택해서 빌드를 합니다. (또는 Ctrl + shift + B)

Important

디버거를 바로 실행하지 마세요. 빌드를 하지 않고 아래 디버거 실행하기를 선택하면 오류가 발생합니다.

오류가 발생하면 디버거를 중단하고, 빌드를 실행해 주시기 바랍니다.

Tip

Visual Studio 는 앞에서 설정한 원격의 리눅스에 지정해준 사용자 아이디로 로그인해서 소스를 복사하고 빌드를 진행합니다. 소스 디렉터리와 빌드 디렉터리는 해당 사용자 아이디의 홈디렉터리 아래 projects 라는 디렉터리 아래 존재하게 됩니다.

그렇기 때문에 이름이 같은 프로젝트는 Windows 의 저장 경로가 다르더라도 리모트 리눅스에서 프로젝트 이름이 같기 때문에 문제가 될 수 있습니다.

대부분의 경우 이 디렉터리를 직접 접근하실 일은 없습니다.

Note

빌드 타입은 DebugRelease 두 가지로 생성되며, 빌드 타입을 전환하면 Visual Studio 는 다시 cmake 를 실행합니다. 각 빌드 타입이 cmake 의 빌드 타입에 대응되는 방식은 아래와 같습니다.

VS 빌드 타입

cmake 의 빌드 타입

Debug

Debug

Release

RelWithDebInfo

디버거 실행하기

디버그 버전의 빌드가 된 후에 F5 등으로 디버거를 띄우기 위해서는 디버깅 타겟을 지정하셔야 됩니다.

Note

처음 프로젝트를 생성한 상태에서는 디버깅 타겟을 지정할 수 없습니다. 빌드에 성공하면 디버깅 타겟을 지정할 수 있습니다.

_images/vs_remote_debugging1.png

만일 Flavor: 역할에 따라 서버 구분하기 에 언급된대로 여러 flavor 가 지정된 경우 각 flavor 별로 디버깅 타겟이 표시됩니다. 원하는 flavor 를 선택하시면 됩니다.

디버깅 타겟을 지정한 뒤에는 브레이크포인트를 지정하고 디버거를 띄우실 수 있게 됩니다.

인텔리센스 동작하게 하기

Visual Studio 는 자동으로 원격의 Linux 에 소스를 복사하고 cmake 를 실행하고, 서버를 실행하지만, 이는 어디까지나 로컬 컴퓨터 (즉, 개발자의 Windows 컴퓨터) 에서 원격의 Linux 서버쪽으로 단방향으로 파일을 복사하는 작업만을 수행하는 것입니다.

다시 말해 서버를 빌드하고 자동으로 생성되는 소스 파일들 (예를 들면, ORM Part 3: 인터페이스 클래스게임 운영 Part 3: 플레이어 행동 로그 등의 기능으로 자동으로 생성되는 파일들)을 자동으로 로컬 컴퓨터로 복사해주지는 않습니다. 이 때문에 빌드는 문제가 없지만 경우에 따라서 인텔리센스가 심볼을 제대로 찾지 못하는 경우가 발생할 수 있는데 이때는 Visual Studio 메뉴에서 프로젝트 > 솔루션 다시 검사 메뉴를 선택해서 강제로 해당 파일들을 로컬 컴퓨터로 복사해올 수 있습니다.

Important

특히 프로젝트를 만들고 처음 빌드 한 뒤에는 인텔리센스가 해당 파일들의 존재를 전혀 모르는 상태이므로 반드시 이 작업을 해주셔야 됩니다.

_images/vs_remote_intellisense1.png

Flavor 추가하기

Flavor: 역할에 따라 서버 구분하기 에 설명된대로 아이펀 엔진은 같은 코드베이스를 공유하면서 서로 다른 방식으로 서버가 동작하게 할 수 있는 flavor 라는 기능을 제공합니다. 각 서버 타입(flavor) 별로 별도의 MANIFEST.json 설정 파일과 서버 데몬 스크립트를 설정할 수 있는데, 통상적으로 아이펀 엔진 프로젝트를 Linux 에서 빌드하면 자동으로 기본 파일이 생성됩니다.

그러나 앞서 언급드린 것처럼 Visual Studio 는 양방향으로 소스를 동기화하는 것이 아니라 개발자의 Windows 컴퓨터에서 원격의 Linux 로만 파일을 동기화하기 때문에 이렇게 자동 생성된 파일을 Windows 컴퓨터로 가져오지 못합니다. 따라서 이를 우회하기 위해서는 CMakeLists.txtflavor 를 추가한 뒤에 명시적으로 설정 파일들을 생성해야됩니다.

솔루션 탐색기에서 CMakeLists.txt 를 선택하시고 마우스 오른쪽 버튼을 클릭하시면 아래 그림과 같이 Reflect flavors 라는 메뉴가 표시됩니다. 이를 클릭하시면 됩니다.

_images/vs_remote_flavor1.png

이 작업을 실행하면 각 flavor 별로 MANIFEST.json 파일이 생성됩니다.

_images/vs_remote_flavor2.png

그리고 디버깅 타겟 역시 자동으로 생성됩니다.

_images/vs_remote_flavor3.png

서버 패키징 하기

서버 관리 Part 3: 서버 패키징 에 언급된 것처럼 아이펀 엔진 게임은 TAR 압축 파일, Ubuntu 패키지 파일 형태로 패키징 할 수 있습니다. 솔루션 탐색기에서 CMakeLists.txt 를 선택한 후 마우스 오른쪽 버튼을 누르면 Package (Debug) 혹은 Package (Release) 를 선택할 수 있습니다. 각각 디버그 버전과 릴리즈 버전을 패키징합니다.

_images/vs_remote_packaging1.png

Important

패키징 된 결과물은 원격의 리눅스 서버에 남게 되고, 로컬 Windows 컴퓨터로 자동으로 복사되지 않습니다. Filezilla 처럼 scp 를 지원하는 파일 전송 프로그램을 이용해서 파일을 복사하셔야 됩니다. Package 를 실행하면 아래 그림처럼 파일의 위치를 표시해줍니다.

_images/vs_remote_packaging2.png