이 출시되었습니다! 11월의 새로운 기능 및 수정 사항을 읽어보세요.

C++ 및 WSL을 VS Code에서 사용하기

이 튜토리얼에서는 Windows Subsystem for Linux(WSL)의 Ubuntu에서 Visual Studio Code를 GCC C++ 컴파일러(g++) 및 GDB 디버거와 함께 사용하도록 구성하는 방법을 알아봅니다. GCC는 GNU 컴파일러 모음을 의미하며, GDB는 GNU 디버거입니다. WSL은 가상 머신이 아닌 실제 컴퓨터 하드웨어에서 직접 실행되는 Windows 내의 Linux 환경입니다.

참고: 이 튜토리얼의 많은 내용은 Linux 컴퓨터에서 C++ 및 VS Code를 직접 작업하는 데 적용됩니다.

Visual Studio Code는 WSL 확장을 통해 WSL에서 직접 작업하는 기능을 지원합니다. 이 모드의 WSL 개발을 권장합니다. 이 모드에서는 컴파일러뿐만 아니라 모든 소스 코드 파일이 Linux 배포판에 호스팅됩니다. 자세한 내용은 VS Code 원격 개발을 참조하십시오.

이 튜토리얼을 완료하면 자체 C++ 프로젝트를 만들고 구성할 준비가 되며, VS Code 설명서를 탐색하여 다양한 기능에 대한 추가 정보를 얻을 수 있습니다. 이 튜토리얼은 GCC, Linux 또는 C++ 언어를 가르치지 않습니다. 이러한 주제에 대해서는 웹에서 많은 유용한 리소스를 찾을 수 있습니다.

문제가 발생하면 VS Code 설명서 리포지토리에서 이 튜토리얼에 대한 이슈를 자유롭게 제출해 주십시오.

전제 조건

이 튜토리얼을 성공적으로 완료하려면 다음 단계를 수행해야 합니다.

  1. Visual Studio Code를 설치합니다.

  2. WSL 확장을 설치합니다.

  3. Windows Subsystem for Linux를 설치한 다음, 해당 페이지의 링크를 사용하여 원하는 Linux 배포판을 설치합니다. 이 튜토리얼에서는 Ubuntu를 사용합니다. 설치 중에 Linux 사용자 암호를 기억하십시오. 추가 소프트웨어를 설치할 때 필요합니다.

Linux 환경 설정

  1. WSL용 Bash 셸을 엽니다. Ubuntu 배포판을 설치한 경우 Windows 검색 상자에 "Ubuntu"를 입력한 다음 결과 목록에서 클릭합니다. Debian의 경우 "Debian"을 입력하는 식입니다.

    Ubuntu in Start Menu

    셸이 열리면 기본적으로 사용자 이름과 컴퓨터 이름으로 구성된 명령 프롬프트가 표시되며, 홈 디렉토리에 있게 됩니다. Ubuntu의 경우 다음과 같이 표시됩니다.

    Bash Shell

  2. projects라는 디렉토리를 만들고 그 아래에 helloworld라는 하위 디렉토리를 만듭니다.

    mkdir projects
    cd projects
    mkdir helloworld
    
  3. 소스 코드를 편집하는 데 VS Code를 사용하겠지만, 소스 코드는 Linux에서 g++ 컴파일러를 사용하여 컴파일하게 됩니다. 또한 Linux에서 GDB를 사용하여 디버깅하게 됩니다. 이러한 도구는 Ubuntu에 기본적으로 설치되어 있지 않으므로 설치해야 합니다. 다행히 이 작업은 매우 쉽습니다!

  4. WSL 명령 프롬프트에서 먼저 apt-get update를 실행하여 Ubuntu 패키지 목록을 업데이트합니다. 오래된 배포판은 새 패키지를 설치하려는 시도에 때때로 방해가 될 수 있습니다.

    sudo apt-get update
    

    원하는 경우 sudo apt-get update && sudo apt-get dist-upgrade를 실행하여 시스템 패키지의 최신 버전을 다운로드할 수도 있지만, 연결 속도에 따라 상당한 시간이 더 걸릴 수 있습니다.

  5. 명령 프롬프트에서 다음을 입력하여 GNU 컴파일러 도구와 GDB 디버거를 설치합니다.

    sudo apt-get install build-essential gdb
    
  6. whereis 명령으로 g++ 및 gdb를 찾아서 설치가 성공했는지 확인합니다. 파일 이름이 whereis 명령에서 반환되지 않으면 업데이트 명령을 다시 실행해 보십시오.

    whereis g++
    whereis gdb
    

참고: g++ 컴파일러와 GDB 디버거를 설치하는 설정 단계는 WSL이 아닌 Linux 시스템에서 직접 작업하는 경우에도 적용됩니다. WSL의 helloworld 프로젝트에서 VS Code를 실행하고 편집, 빌드 및 디버깅 단계는 동일합니다.

WSL에서 VS Code 실행

WSL 터미널에서 code .를 입력하여 helloworld 프로젝트 폴더로 이동한 다음 VS Code를 실행합니다.

cd $HOME/projects/helloworld
code .

"VS Code Server 설치 중"이라는 메시지가 표시됩니다. VS Code는 Linux 측에 작은 서버를 다운로드하고 설치하며, 데스크톱 VS Code는 이 서버와 통신하게 됩니다. 그런 다음 VS Code가 시작되고 helloWorld 폴더가 열립니다. 파일 탐색기에는 VS Code가 이제 WSL 컨텍스트에서 실행 중이며 제목 표시줄에 WSL: Ubuntu라고 표시됩니다.

File Explorer in WSL

상태 표시줄에서도 원격 컨텍스트를 확인할 수 있습니다.

Remote context in the Status bar

원격 상태 표시줄 항목을 클릭하면 해당 세션에 적합한 원격 명령 드롭다운이 표시됩니다. 예를 들어 WSL에서 실행 중인 세션을 종료하려면 드롭다운에서 원격 연결 닫기 명령을 선택할 수 있습니다. WSL 명령 프롬프트에서 code .를 실행하면 WSL에서 실행 중인 VS Code가 다시 시작됩니다.

code . 명령은 현재 작업 중인 폴더에서 VS Code를 열었으며, 이 폴더가 "작업 영역"이 됩니다. 튜토리얼을 진행하면서 작업 영역의 .vscode 폴더에 세 개의 파일이 생성되는 것을 볼 수 있습니다.

  • c_cpp_properties.json (컴파일러 경로 및 IntelliSense 설정)
  • tasks.json (빌드 지침)
  • launch.json (디버거 설정)

소스 코드 파일 추가

파일 탐색기 제목 표시줄에서 새 파일 버튼을 선택하고 파일 이름을 helloworld.cpp로 지정합니다.

New File title bar button

C/C++ 확장 설치

파일을 만들고 VS Code가 C++ 언어 파일임을 감지하면, 아직 설치되지 않은 경우 Microsoft C/C++ 확장을 설치하라는 메시지가 표시될 수 있습니다.

C++ extension notification

설치를 선택한 다음, 확장 프로그램 보기에 다시 로드 필요 버튼이 표시되면 클릭하여 C/C++ 확장의 설치를 완료합니다.

이미 VS Code 로컬에 C/C++ 언어 확장 프로그램이 설치되어 있는 경우, 확장 프로그램 보기(⇧⌘X (Windows, Linux Ctrl+Shift+X))로 이동하여 해당 확장 프로그램을 WSL에 설치해야 합니다. 로컬에 설치된 확장 프로그램은 WSL에 설치 버튼을 선택한 다음 다시 로드 필요를 선택하여 WSL에 설치할 수 있습니다.

Install in WSL button

Hello World 소스 코드 추가

이제 이 소스 코드를 붙여넣습니다.

#include <iostream>
#include <vector>
#include <string>

using namespace std;

int main()
{
   vector<string> msg {"Hello", "C++", "World", "from", "VS Code", "and the C++ extension!"};

   for (const string& word : msg)
   {
      cout << word << " ";
   }
   cout << endl;
}

이제 ⌘S (Windows, Linux Ctrl+S)를 눌러 파일을 저장합니다. 방금 추가한 파일이 VS Code 사이드바의 파일 탐색기 보기(⇧⌘E (Windows, Linux Ctrl+Shift+E))에 표시되는 것을 확인합니다.

File Explorer

기본 **파일** 메뉴에서 자동 저장을 선택하여 자동 저장을 활성화하여 파일 변경 사항을 자동으로 저장할 수도 있습니다.

가장 왼쪽에 있는 활동 표시줄을 사용하면 검색, 소스 제어, 실행과 같은 다양한 보기를 열 수 있습니다. 실행 보기는 이 튜토리얼에서 나중에 살펴볼 것입니다. 다른 보기에 대한 자세한 내용은 VS Code 사용자 인터페이스 설명서에서 확인할 수 있습니다.

IntelliSense 탐색

helloworld.cpp 파일에서 vector 또는 string 위에 마우스를 올려놓으면 형식 정보를 볼 수 있습니다. msg 변수의 선언이 끝난 후 msg.를 입력하여 멤버 함수를 호출할 때처럼 타이핑을 시작하면 됩니다. 즉시 모든 멤버 함수를 보여주는 완성 목록이 표시되고, msg 개체의 형식 정보를 보여주는 창이 나타납니다.

Statement completion IntelliSense

선택한 멤버를 삽입하려면 Tab 키를 누른 다음, 여는 괄호를 추가하면 함수에서 필요한 인수에 대한 정보가 표시됩니다.

helloworld.cpp 실행

C++ 확장은 설치된 C++ 컴파일러를 사용하여 프로그램을 빌드합니다. VS Code에서 helloworld.cpp를 실행하고 디버그하기 전에 C++ 컴파일러가 설치되어 있는지 확인하십시오.

  1. helloworld.cpp를 열어 활성 파일로 만듭니다.

  2. 편집기 오른쪽 상단에 있는 재생 버튼을 누릅니다.

    Screenshot of helloworld.cpp and play button

  3. 시스템에서 감지된 컴파일러 목록에서 g++ 활성 파일 빌드 및 디버그를 선택합니다.

    C++ debug configuration dropdown

helloworld.cpp를 처음 실행할 때만 컴파일러를 선택하라는 메시지가 표시됩니다. 이 컴파일러는 tasks.json 파일에 "기본" 컴파일러로 설정됩니다.

  1. 빌드가 성공하면 프로그램의 출력이 통합 **터미널**에 표시됩니다.

    screenshot of program output

프로그램을 처음 실행하면 C++ 확장에서 tasks.json을 생성하며, 이 파일은 프로젝트의 .vscode 폴더에 있습니다. tasks.json은 빌드 구성을 저장합니다.

새로운 tasks.json 파일은 다음과 같은 JSON과 유사해야 합니다.

{
  "version": "2.0.0",
  "tasks": [
    {
      "type": "shell",
      "label": "C/C++: g++ build active file",
      "command": "/usr/bin/g++",
      "args": ["-g", "${file}", "-o", "${fileDirname}/${fileBasenameNoExtension}"],
      "options": {
        "cwd": "/usr/bin"
      },
      "problemMatcher": ["$gcc"],
      "group": {
        "kind": "build",
        "isDefault": true
      },
      "detail": "Task generated by Debugger."
    }
  ]
}

참고: tasks.json 변수에 대해 자세히 알아보려면 변수 참조를 참조하십시오.

command 설정은 실행할 프로그램을 지정하며, 이 경우에는 g++입니다. args 배열은 g++에 전달될 명령줄 인수를 지정합니다. 이러한 인수는 컴파일러가 예상하는 순서대로 지정해야 합니다.

이 작업은 g++에게 활성 파일(${file})을 가져와 컴파일하고, 현재 디렉터리(${fileDirname})에 활성 파일과 동일한 이름을 가지지만 확장자가 없는 실행 파일을 생성하도록 지시합니다(예: ${fileBasenameNoExtension}). 이 예제에서는 helloworld가 됩니다.

label 값은 작업 목록에서 볼 수 있는 이름입니다. 원하는 대로 이름을 지정할 수 있습니다.

detail 값은 작업 목록에서 작업의 설명으로 표시됩니다. 비슷한 작업과 구별하기 위해 이 값을 다시 이름 지정하는 것이 좋습니다.

이제부터 재생 버튼은 tasks.json에서 읽어 프로그램을 빌드하고 실행하는 방법을 파악합니다. tasks.json에 여러 빌드 작업을 정의할 수 있으며, 기본값으로 표시된 작업이 재생 버튼에서 사용됩니다. 기본 컴파일러를 변경해야 하는 경우 작업: 기본 빌드 작업 구성을 실행할 수 있습니다. 또는 tasks.json 파일을 수정하고 이 부분을 바꿔서 기본값을 제거할 수 있습니다.

    "group": {
        "kind": "build",
        "isDefault": true
    },

이것으로

    "group": "build",

tasks.json 수정

tasks.json을 수정하여 여러 C++ 파일을 빌드할 수 있습니다. "${file}" 대신 "${workspaceFolder}/*.cpp"와 같은 인수를 사용하면 현재 폴더의 모든 .cpp 파일을 빌드할 수 있습니다. "${fileDirname}/${fileBasenameNoExtension}"을 하드 코딩된 파일 이름(예: 'helloworld.out')으로 바꿔서 출력 파일 이름을 수정할 수도 있습니다.

helloworld.cpp 디버그

코드를 디버그하려면

  1. helloworld.cpp로 돌아가 활성 파일로 만듭니다.
  2. 편집기 여백을 클릭하거나 현재 줄에서 F9를 사용하여 중단점을 설정합니다. helloworld.cpp의 중단점 스크린샷
  3. 재생 버튼 옆에 있는 드롭다운 메뉴에서 C/C++ 파일 디버그를 선택합니다. 재생 버튼 드롭다운 메뉴 스크린샷
  4. 시스템에서 감지된 컴파일러 목록에서 C/C++: g++ 활성 파일 빌드 및 디버그를 선택합니다(helloworld.cpp를 처음 실행하거나 디버그할 때만 컴파일러를 선택하라는 메시지가 표시됩니다). C++ 디버그 구성 드롭다운

재생 버튼에는 C/C++ 파일 실행C/C++ 파일 디버그의 두 가지 모드가 있습니다. 마지막으로 사용한 모드로 기본 설정됩니다. 재생 버튼에 디버그 아이콘이 표시되면 드롭다운 메뉴 항목을 선택하는 대신 재생 버튼을 선택하여 디버그할 수 있습니다.

디버거 탐색

코드를 단계별로 실행하기 전에 사용자 인터페이스의 몇 가지 변경 사항을 잠시 살펴보겠습니다.

  • 통합 터미널이 소스 코드 편집기 하단에 나타납니다. **디버그 출력** 탭에서 디버거가 실행 중임을 나타내는 출력이 표시됩니다.

  • 편집기는 줄 12를 강조 표시하며, 이 줄은 디버거를 시작하기 전에 설정한 중단점입니다.

    Initial breakpoint

  • 왼쪽에 있는 **실행 및 디버그** 보기에 디버깅 정보가 표시됩니다. 튜토리얼 뒷부분에서 예시를 볼 수 있습니다.

  • 코드 편집기 상단에 디버깅 제어 패널이 나타납니다. 왼쪽의 점을 잡아서 화면 주위로 이동할 수 있습니다.

    Debugging controls

작업 영역에 이미 launch.json 파일이 있는 경우, 재생 버튼은 C++ 파일을 실행하고 디버깅하는 방법을 결정할 때 해당 파일에서 읽어옵니다. launch.json이 없는 경우, 재생 버튼은 임시 "빠른 디버그" 구성을 즉석에서 생성하여 launch.json이 전혀 필요 없도록 합니다!

코드 단계별 실행

이제 코드를 단계별로 실행할 준비가 되었습니다.

  1. 디버깅 제어 패널에서 **건너뛰기** 아이콘을 클릭하거나 누릅니다.

    Step over button

    이것은 프로그램 실행을 for 루프의 첫 번째 줄로 진행시키며, msg 변수가 생성되고 초기화될 때 호출되는 vectorstring 클래스의 내부 함수 호출을 모두 건너뜁니다. 측면의 변수 창에서 변경된 내용을 확인합니다.

    Debugging windows

  2. **건너뛰기**를 다시 눌러 다음 문으로 이동합니다(루프 초기화를 위해 실행되는 모든 내부 코드를 건너뜁니다). 이제 **변수** 창에 루프 변수에 대한 정보가 표시됩니다.

  3. 다음으로 건너뛰기를 다시 눌러 cout 문을 실행합니다. (C++ 확장은 마지막 cout가 실행될 때까지 디버그 콘솔에 출력을 표시하지 않습니다.)

  4. 원하는 경우 **건너뛰기**를 계속 눌러 벡터의 모든 단어가 콘솔에 인쇄될 때까지 실행할 수 있습니다. 하지만 궁금하다면 **단계별 실행** 버튼을 눌러 C++ 표준 라이브러리의 소스 코드를 단계별로 실행해 보세요!

    Breakpoint in gcc standard library header

    자신의 코드로 돌아가려면 **건너뛰기**를 계속 누르는 것이 한 가지 방법입니다. 다른 방법은 코드 편집기에서 helloworld.cpp 탭으로 전환하여 루프 안의 cout 문에 삽입 지점을 놓고 F9를 눌러 코드에 중단점을 설정하는 것입니다. 왼쪽에 있는 여백에 빨간색 점이 나타나 이 줄에 중단점이 설정되었음을 나타냅니다.

    Breakpoint in main

    그런 다음 F5를 눌러 표준 라이브러리 헤더의 현재 줄부터 실행을 시작합니다. 실행은 cout에서 중단됩니다. 원하는 경우 F9를 다시 눌러 중단점을 해제할 수 있습니다.

    루프가 완료되면 통합 터미널의 디버그 콘솔 탭에서 출력과 GDB에서 출력되는 기타 진단 정보를 볼 수 있습니다.

    Debug console display

감시 설정

프로그램 실행 중에 변수 값을 추적하려면 해당 변수에 대한 감시를 설정합니다.

  1. 삽입점을 루프 안에 놓습니다. 감시 창에서 더하기 기호를 클릭하고 텍스트 상자에 루프 변수의 이름인 word를 입력합니다. 이제 루프를 단계별로 실행하면서 감시 창을 확인합니다.

    Watch window

  2. 중단점에서 실행이 일시 중지된 동안 변수 값을 빠르게 보려면 마우스 포인터로 해당 변수 위로 가져가면 됩니다.

    Mouse hover

다음으로, VS Code에 프로그램을 빌드(컴파일)하는 방법을 알리는 tasks.json 파일을 만듭니다. 이 작업은 g++ 컴파일러를 호출하여 소스 코드에서 실행 파일을 생성합니다.

다음 단계에서 빌드 작업을 만드는 데 편집기의 활성 파일을 컨텍스트로 사용하므로 helloworld.cpp가 편집기에서 열려 있는 것이 중요합니다.

launch.json으로 디버깅 사용자 지정

재생 버튼 또는 F5로 디버그할 때 C++ 확장은 즉석에서 동적 디버그 구성을 생성합니다.

런타임에 프로그램에 전달할 인수를 지정하는 것과 같이 디버그 구성을 사용자 지정하려는 경우가 있습니다. launch.json 파일에 사용자 지정 디버그 구성을 정의할 수 있습니다.

launch.json을 만들려면 재생 버튼 드롭다운 메뉴에서 디버그 구성 추가를 선택합니다.

Add debug configuration play button menu

그러면 다양한 사전 정의된 디버그 구성에 대한 드롭다운이 표시됩니다. g++ 활성 파일 빌드 및 디버그를 선택합니다.

C++ debug configuration dropdown

VS Code는 다음과 같은 launch.json 파일을 생성합니다.

{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "C/C++: g++ build and debug active file",
      "type": "cppdbg",
      "request": "launch",
      "program": "${fileDirname}/${fileBasenameNoExtension}",
      "args": [],
      "stopAtEntry": false,
      "cwd": "${workspaceFolder}",
      "environment": [],
      "externalConsole": false,
      "MIMode": "gdb",
      "miDebuggerPath": "/usr/bin/gdb",
      "setupCommands": [
        {
          "description": "Enable pretty-printing for gdb",
          "text": "-enable-pretty-printing",
          "ignoreFailures": true
        }
      ],
      "preLaunchTask": "C/C++: g++ build active file"
    }
  ]
}

위 JSON에서 program은 디버그하려는 프로그램을 지정합니다. 여기서는 활성 파일 폴더 ${fileDirname}과 확장자가 없는 활성 파일 이름 ${fileBasenameNoExtension}으로 설정되어 있으며, helloworld.cpp가 활성 파일인 경우 helloworld가 됩니다. args 속성은 런타임에 프로그램에 전달할 인수 배열입니다.

기본적으로 C++ 확장은 소스 코드에 중단점을 추가하지 않으며 stopAtEntry 값은 false로 설정됩니다.

디버깅을 시작할 때 main 메서드에서 중단되도록 stopAtEntry 값을 true로 변경합니다.

이제부터 재생 버튼 및 F5는 디버깅을 위해 프로그램을 시작할 때 launch.json 파일에서 읽어옵니다.

C/C++ 구성

C/C++ 확장에 대한 더 많은 제어를 원하면 c_cpp_properties.json 파일을 만들어 컴파일러 경로, 포함 경로, C++ 표준(기본값은 C++17) 등과 같은 설정을 변경할 수 있습니다.

명령 팔레트(⇧⌘P (Windows, Linux Ctrl+Shift+P))에서 C/C++: 구성 편집(UI) 명령을 실행하여 C/C++ 구성 UI를 볼 수 있습니다.

Command Palette

이렇게 하면 **C/C++ 구성** 페이지가 열립니다. 여기서 변경하면 VS Code에서 해당 변경 사항을 .vscode 폴더에 있는 c_cpp_properties.json이라는 파일에 씁니다.

Command Palette

프로그램에서 작업 영역이나 표준 라이브러리 경로에 없는 헤더 파일을 포함하는 경우에만 포함 경로 설정을 수정하면 됩니다.

Visual Studio Code는 이러한 설정을 .vscode/c_cpp_properties.json에 배치합니다. 해당 파일을 직접 열면 다음과 같은 모양이어야 합니다.

{
  "configurations": [
    {
      "name": "Linux",
      "includePath": ["${workspaceFolder}/**"],
      "defines": [],
      "compilerPath": "/usr/bin/gcc",
      "cStandard": "c11",
      "cppStandard": "c++17",
      "intelliSenseMode": "clang-x64"
    }
  ],
  "version": 4
}

WSL 세션 종료

WSL에서 작업을 마친 후, 메인 파일 메뉴와 명령 팔레트(⇧⌘P (Windows, Linux Ctrl+Shift+P))에서 사용할 수 있는 원격 연결 닫기 명령으로 원격 세션을 닫을 수 있습니다. 이렇게 하면 VS Code가 로컬에서 다시 시작됩니다. [WSL] 접미사가 있는 폴더를 선택하여 파일 > 최근 항목 열기 목록에서 WSL 세션을 쉽게 다시 열 수 있습니다.

다음 단계

  • VS Code 사용자 가이드를 탐색합니다.
  • C++ 확장 개요를 검토합니다.
  • 새 작업 영역을 만들고 .json 파일을 복사한 다음 새 작업 영역 경로, 프로그램 이름 등에 대한 필요한 설정을 조정하고 코딩을 시작하세요!
© . This site is unofficial and not affiliated with Microsoft.