4. 개발환경(C++): Remote Linux Server & Visual Studio 2015

Note

이번 장에서 설명하는 iFunEngine for Visual StudioVisual Studio 2015 확장 프로그램에 대한 설명입니다. 아이펀 엔진 윈도우 버전에 대한 안내는 iFunEngine for Windows 를 참고해 주세요.

Microsoft Visual StudioLinux Development with C++ 확장 기능을 사용해서 원격 리눅스 서버의 아이펀엔진 프로젝트를 개발 할 수 있습니다.

iFunengine for Visual Studio 확장 프로그램을 사용하면 Linux Development with C++ 확장 기능의 설정을 편하게 할 수 있습니다.

Note

현재, iFunEngine for Visual StudioVisual Studio 2015 만 지원하고 있으며, Visual Studio 2017 이 후 버전에 대해서는 추후 지원 할 예정입니다.

사용자는 이 확장 프로그램을 통해서 원격 리눅스 서버에 프로젝트를 생성거나, 이미 생성한 프로젝트의 코드를 수정하고 실행할 수 있습니다.

Linux Development with C++ 확장 기능의 기본적인 동작 방식은 원격 리눅스 서버에 원본 소스코드를 두고 SSH 연결 에 기반하여 로컬 호스트에서 수정한 사본 소스코드를 원격 리눅스 호스로 전송하고, SHELL 명령 또는 GDB 명령 들을 원격에서 실행하고 결과를 전송받는 방식입니다.

4.1. 확장 프로그램 설치하기

  1. 먼저, Visual Studio 2015Visual C++ for Linux Development 확장 프로그램을 다운로드하고 설치합니다.
  2. 다음으로 iFunEngine for Visual Studio 확장 프로그램을 다운로드하고 설치합니다.
  3. 도구 > 확장 및 업데이트 에서 설치되어 사용 가능한 확장 프로그램을 확인할 수 있습니다.
_images/vs_extension01.png

4.2. Visual Studio 프로젝트 만들기

원격 리눅스 개발 환경에서는 물리적으로 두 개의 프로젝트가 존재합니다. 하나는 원격 리눅스 서버에 있는 원본 프로젝트이고, 또 하나는 Visual Studio 2015 를 실행하는 호스트에 있는 사본 프로젝트입니다.

Note

원격 리눅스 서버에 있는 원본 프로젝트는 이미 존재할 수도 있고(import), 사본을 생성하는 시점에 생성할 수 있습니다.(create)

Visual Studio 2015 프로젝트를 만드는 것은 사본 프로젝트를 만드는 것을 의미합니다.

Visual Studio 2015 프로젝트를 만들기 위해서는 파일 > 새로 만들기 > 프로젝트 > Visual C++ 메뉴에서 iFunEngine Project 를 선택합니다. 아래 스크린샷에서 이름은 Visual Studio 2015 프로젝트 이름이며 원격 리눅스 서버에 있는 실제 프로젝트 이름과 다른 이름을 사용할 수 있습니다. 확인 버튼을 누르면 원격 리눅스 호스트 설정 단계로 진행합니다.

_images/vs_extension02.png

4.2.1. 원격 리눅스 서버 접속 정보 설정하기

Visual Studio 2015Visual C++ for Linux Development 기능은 SSH 연결에 기반하여 동작하기 때문에 iFunEngine Project 를 생성하는 과정에 원격 리눅스 서버에 대한 SSH 접속 정보가 반드시 필요합니다. 한번 등록한 접속 정보는 저장되어 목록에 추가되기 때문에 선택하는 것만으로 다시 사용 할 수 있습니다.

  1. iFunEngine Project 를 새로 만들면 다음과 같은 창이 나옵니다.
_images/vs_extension03.png
  1. Remote Connection 항목에서 이전에 사용했던 접속 정보를 선택하거나 새 접속 정보를 만들어야 하는 경우는 Create New Connection 을 선택합니다.
_images/vs_extension04.png
  1. Create New Connection 을 선택하면 다음과 같은 화면이 나타납니다. 준비된 원격 리눅스 서버의 접속 정보를 등록합니다. 입력을 마치고 Connect 버튼을 누르면 원결 리눅스 서버에 접속 가능한지 확인하고, 정상적으로 접속 가능한 경우 창이 닫힙니다.
_images/vs_extension05.png

Tip

접속 정보를 변경해서 다른 원격 리눅스 서버에서 개발을 하려고 하는 경우는 연결 대상 프로젝트 변경하기 를 참고 해 주세요.

4.2.2. 원본 프로젝트 경로 설정하기

다음과 같은 화면이 나타나면, 원본 프로젝트의 경로와 프로젝트 이름에 해당하는 속성들을 설정 해 주세요.

  • Remote Root Directory : 원격 리눅스 서버의 프로젝트가 있는 경로.
  • Server Component Name : 원격 리눅스 서버의 프로젝트 이름.
_images/vs_extension06.png

4.2.3. 기본 프로젝트를 생성해서 불러오기

Create 버튼을 클릭하면 원력 리눅스 호스트의 Remote Root Directory 위치에 Server Component Name 프로젝트({Server Component Name}-source 디렉터리) 를 생성하고, 이 프로젝트로부터 로컬 호스트의 Visual Studio 프로젝트를 초기화 합니다.

_images/vs_extension07.png

Warning

이미 같은 이름의 프로젝트가 존재하는 경우 실패할 수 있으니, 다른 이름을 지정하거나 아래 이미 존재하는 프로젝트 불러오기 를 참고 해 주세요.

4.2.4. 이미 존재하는 프로젝트 불러오기

Import 버튼을 클릭하면 원력 리눅스 호스트의 Remote Root Directory 에서 {Server Component Name}-source 프로젝트 디렉터리로부터 로컬 호스트의 Visual Studio 프로젝트를 초기화 합니다.

Warning

iFun Engine 에서 자동으로 구성하는 {project_name}-source 디렉토리와 {project_name}-build 디렉토리 구조를 임의로 변경하면 불러오기에 실패할 수 있습니다.

4.3. 새로운 파일을 추가하기

새 파일을 추가할 때는 파일이 실제로 저장되는 경로를 확인해야 합니다. 아이펀엔진에서 프로젝트 소스코드는 프로젝트 디렉토리 아래에 있는 src 디렉터리에 저장하도록 권장하고 있습니다. 이렇게 추가한 파일은 Remote GDB Debugger 메뉴를 실행하면 원격 리눅스 호스트로 업로드됩니다.

_images/vs_extension11.png

4.4. 파일 동기화

프로젝트가 원본과 사본으로 구분되어 있기 때문에 변경이 일어나면 서로의 파일 내용을 동기화 하는 것이 중요합니다. 로컬 호스트와 원격 리눅스 호스트의 파일 내용은 다음과 같은 경우에 복사에 의해서 덮어 씌워집니다.

  1. 로컬 호스트에서 리눅스 호스트로 복사.
  • Remote GDB Debugger : 프로젝트를 Build 하고 실행하기 위해서 Remote GDB Debugger 메뉴를 실행하면, 먼저 로컬 호스트의 파일 내용을 원격 리눅스 호스트에 업로드합니다.
  1. 리눅스 호스트에서 로컬 호스트로 복사.
  • 도구->Force to Re-Import From Server : 원격 리눅스 호스트의 파일들을 로컬 호스토로 복사합니다.
  • 도구->Get Missing Files From Server : 원격 리눅스 호스트의 파일 목록 중에서 로컬 호스트에 없는 파일들만 복사합니다.
_images/vs_extension12.png

Warning

파일 동기화 역시 SSH 연결에 기반하는 SFTP 를 사용해서 단방향 전송으로 동기화가 진행됩니다. 그러므로 수신측 소스코드에만 존재하는 파일의 경우 송신측에는 전송되지 않음을 유의 해 주시기 바랍니다.

4.5. 프로젝트 빌드하기

Visual Studio 2015Build 메뉴를 이용하여 프로젝트를 빌드하실 수 있습니다. 이 때, 로컬 호스트의 파일의 수정 내역과 새로 추가된 파일들을 복사합니다.

_images/vs_extension13.png

4.6. 프로젝트 디버깅하기

비주얼 스튜디오의 Debug 메뉴를 이용하여 디버깅을 할 수 있으며, Breakpoint 기능 역시 사용하실 수 있습니다.

_images/vs_extension10.png

Note

디버깅 기능은 원격 리눅스 호스트의 GDB 명령을 사용합니다.

4.7. 인텔리센스 설정하기

Visual Studio 2015 의 자동 완성 기능을 사용해서 개발 편의성을 향상시킬 수 있습니다. 그러기 위해서는 참조하는 헤더 파일들을 인텔리센스 캐시에 추가해야합니다.

iFunEngine for Visual Studio 는 다음의 메뉴를 제공하여 Visual Studio 2015 의 인텔리센스 기능을 사용하기 쉽도록 만들어 드립니다.

  • 도구 > Download iFunEngine headers 메뉴로 iFun Engine 의 일반적인 헤더 파일을 다운로드하여 인텔리센스 캐시에 추가할 수 있습니다.
  • 도구 > Download boost headers 메뉴로 boost 라이브러리의 헤더 파일을 다운로드하여 인텔리센스 캐시에 추가할 수 있습니다.

Note

boost 라이브러리의 헤더 파일은 약 80~100MB 정도의 크기로 네트워크의 연결 상태나 성능에 따라 시간이 오래 걸릴 수 있습니다.

모든 헤더 파일을 다운로드하면, 다음과 같이 자동 완성 기능이 적용된 것을 확인하실 수 있습니다.

_images/vs_extension08.png

4.8. Flavor 바꾸기

iFunEngineFlavor 설정에 대한 자세한 내용은 Flavor: 역할에 따라 서버 구분하기 를 참고해주세요.

Visual Studio 2015 에서 flavor 를 바꾸기 위해서는 다음과 같이 하시면 됩니다.

  1. 프로젝트 > 속성 에서 iFunEngine Options 탭 선택.
  2. Server Flavor 속성에 원하는 flavor 이름을 지정하시면 됩니다.
_images/vs_extension09.png

4.9. 연결 대상 프로젝트 변경하기

이미 생성한 Visual Studio 프로젝트의 원격 리눅스 호스트 정보와 프로젝트 정보를 변경하여 원본 프로젝트를 변경하는 방법에 대해서 설명합니다.

Warning

되도록 Visual Studio 프로젝트와 원격 리눅스 호스트의 원본 프로젝트는 1:1로 관리할 것을 권장합니다.

편의를 위해 하나의 Visual Studio 프로젝트의 원격 리눅스 호스트의 원본 프로젝트 정보를 변경하면서 개발을 진행하는 것은 의도하지 않은 오류을 일으킬 수 있습니다.

4.9.1. 원격 리눅스 호스트 정보 변경

프로젝트 속성에서 대상 호스트를 변경 할 수 있습니다. 다만, 연결하고자 하는 원격 리눅스 호스트 정보가 목록에 없는 경우 프로젝트 속성 메뉴에서는 새 호스트 정보를 추가할 수 없기 때문에 원격 리눅스 서버 접속 정보 설정하기 을 참고 해서 새 호스트 정보를 추가한 다음 속성 메뉴로 돌아와서 선택 해 주셔야 합니다.

  1. 프로젝트 > 속성 에서 General 탭 선택.
  2. Remote Build Machine 속성에서 원격 리눅스 호스트를 선택.
  3. Remote Build Root Directory 에 연결하고자 하는 프로젝트의 루트 디렉터리를 입력.
_images/vs_extension10.png

4.9.2. 프로젝트 정보 변경

  1. 프로젝트 > 속성 에서 iFunEngine Options 탭 선택.
  2. Component Name 속성을 수정. 이 정보는 프로젝트 루트 디렉터리의 CMakeLists.txt 파일 내용 중 project(demo CXX C) 에서 찾을 수 있습니다.
  3. Component Name (with CamelCase) 속성을 수정. 이정보는 프로젝트 루트 디렉터리의 CMakeLists.txt 파일 내용 중 set(PROJECT_NAME_CAMEL_CASE Demo) 에서 찾을 수 있습니다.
_images/vs_extension15.png

4.9.3. 주의 사항

  • 연결 프로젝트를 변경하고 Build 를 진행하면 실패할 수 있는데, 파일 동기화 을 참고하시어 소스코드를 동기화 한 후 다시 Build 를 진행 해 보시기 바랍니다.
  • 이 때, 주의 할 점은 force reimportBuild 를 수행하고나면 로컬 호스트의 소스코드와 원격 리눅스 호스트의 소스 코드는 다른 프로젝트에서 사용하던 파일들이 혼재할 수 있습니다.