VSCode WSL2를 이용한 C/C++ 컴파일/빌드/GDB 디버깅 방법 메모

Embedded June·2020년 7월 19일
3

기다렸다 WSL2!

2020년 5월 MS에서는 윈도우10의 2004버전(빌드 19041)을 발표했습니다.
이번 발표의 핵심은 단연코 "WSL2"가 아닐까 싶습니다.
강력하지만 아직 주력으로 사용하기에는 부족함이 많았던 기존의 WSL이 발전되고 편리해져서 돌아왔습니다. 이제 Vmware나 virtualBox 가상환경을 이용하지 않고도 윈도우 하나만으로 리눅스 개발환경을 경험할 수 있습니다. 지금부터 방법을 하나씩 다뤄보도록 하겠습니다.


참고문헌

  • 복잡하지 않고 읽을만 합니다. 읽어보시길 추천드립니다.
  1. WSL2 설치관련: https://docs.microsoft.com/ko-kr/windows/wsl/install-win10
  2. VSCode with WSL2 관련: https://code.visualstudio.com/blogs/2019/09/03/wsl2
  3. WSL 튜토리얼: https://code.visualstudio.com/docs/remote/wsl-tutorial

1. VSCode에 WSL 설치

1.1. WSL이 처음이라면?

  1. 윈도우 Microsoft store에 들어가서 원하는 리눅스 OS 이미지를 다운로드 받습니다.
  2. 아주 편리하게 클릭 한 번이면 설치까지 해줍니다.
    1. 우분투 기준, 20.04LTS까지 배포하고 있습니다.
    2. 저는 안전을 위해 18.04를 설치했습니다.
  3. 설치된 리눅스 운영체제를 1회 실행해서 기초 세팅을 해줍니다.
    1. 관리자(root)계정 비밀번호와 사용자 계정 아이디를 설정합니다.
  4. VSCode의 extension 탭에서 WSL을 설치하시고 1.2절로 넘어갑니다.

1.2. 기존에 WSL이 설치되있다면?

  1. Windows Powershell을 관리자권한으로 실행합니다.
    wsl --list --verbose 또는 wsl -l -v를 입력해서 설치된 WSL 버전을 확인합니다. (본 명령어는 Window10 2004 버전에서 사용할 수 있습니다.)
  2. 아래 코드를 입력해서 "가상 머신 플랫폼" 옵션 기능을 사용하도록 설정합니다.
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
  1. 다음 링크에서 WSL2 리눅스 커널 업데이트 파일을 받고 실행, 설치합니다.
    https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi
  2. wsl --set-default-version 2를 입력해서 앞으로 설치될 모든 리눅스의 기본 wsl 버전을 '2'로 설정합니다. 만일 아직 리눅스가 설치되어있지 않다면 이제 설치하시면 됩니다.
  3. 기존에 설치된 리눅스가 있다면, wsl --list --verbose를 입력해서 현재 설치된 리눅스 가상 OS의 WSL 버전을 확인합니다. version1이라고 나온다면
  4. wsl --set-version <distribution name> <versionNumber>을 입력해서 버전을 업데이트 해줍니다.
    예를 들면, wsl --set-version myUbuntu 2이런식으로 말이죠.

2. VSCode로 Linux C/C++ 코딩하기

2.1. 코딩하기 (c_cpp_properties.json)

  • 이제 WSL 설정이 완료됐으니 간단히 테스트용 코딩을 진행해봅시다.
  • 저는 ~/cppDirectory/project1이라는 경로에 간단히 프로젝트 폴더를 만들어봤습니다. (Easy C++ Projects라는 extension을 사용하면 더 편리합니다)
  • 간단히 .cpp파일을 작성하시고 저장합니다.
  • 기존 WSL에서는 파일을 저장할 때 EACESS Permission denied오류가 발생했지만 WSL2에서는 발생하지 않습니다.

2.2. 컴파일하기 (tasks.json)

  • 빌드 및 컴파일을 진행해봅시다.
  • F1을 눌러 콘솔창을 연 뒤 C/C++:Edit까지 치면
    이렇게 뜹니다. JSON 파일을 열어주고 다음처럼 수정해줍니다.
{
    "configurations": [
        {
            "name": "Linux",
            "includePath": [
                "${workspaceFolder}/**"
            ],
            "defines": [],
            "compilerPath": "/usr/bin/gcc",
            "cStandard": "gnu11",
            "cppStandard": "c++17",
            "intelliSenseMode": "gcc-x64"
        }
    ],
    "version": 4
}
  • 저는 C++17의 기능을 많이 사용하므로 표준을 C++17로 설정하고 gcc(g++) 컴파일 할 것이므로 인델리센스도 gcc(g++) 컴파일러를 따라가도록 합니다. (이렇게 하면, gcc(g++) 컴파일러 내장 함수를 인텔리센스에서 이용할 수 있습니다.)
  • 만일 1절에서 설치한 리눅스 OS에 GCC와 GDB를 설치하지 않았다면 이 단계에서 반드시 설치합시다. 설치방법은 여기서 따로 명시하지 않겠습니다.
  • ctrl+shift+B를 누르면 컴파일을 수행합니다. 물론 아직 task를 설정하지 않았기 때문에 현재로써는 상단에 콘솔창이 뜰 뿐입니다.
  • Tasks: Configure Default Build Task를 누르면 tasks.json파일이 열립니다. 다음처럼 수정해줍니다.
{
    "version": "2.0.0",
    "tasks": [
        {
            "type": "shell",
            "label": "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
            }
        }
    ]
}
  • 현재 경로의 cpp파일을 읽어서 실행파일(.out)을 내보냅니다. -g옵션을 통해 디버깅 여지를 남깁니다.
  • 저장하고 다시 ctrl+shift+B를 누르면 정상적으로 컴파일이 수행됩니다.

2.3. 디버깅하기 (launch.json)

디버깅을 사용하지 않는다면 굳이 이런 귀찮은 일련의 과정을 거쳐가며 VSCode를 사용할 필요가 전혀 없습니다. 그냥 repl.it같은 리눅스 기반 온라인 IDE써서 GDB 돌리면 되니까요. 하지만 저희는 visual studio의 그 변수 하나하나 값을 찍어볼 수 있는, 눈에 확 들어오는 디버깅을 원하므로(저만 그런가요?ㅎㅎ) 마지막까지 설정해줍시다.

  • F5를 누르면 C/C++ extension은 자동으로 현재 경로와 앞서 설정한 세팅에 맞는 적절한 디버깅 설정을 알아서 해줍니다.
  • 여기서 정상적으로 디버깅이 된다면 정말 감사하겠지만, 아쉽게도 정상적으로 디버깅이 시작하지 않으신다면 추가로 설정이 필요합니다.
  • 콘솔을 켜고 launch를 입력해서 launch.json을 open합니다.
  • 이미 어떤 환경설정 값이 있을겁니다. 아래 코드를 보고 적당히 수정을 하셔도 되고, 아예 덮어씌우셔도 됩니다.
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "g++ build and debug active file",
            "type": "cppdbg",
            "request": "launch",
            "program": "${fileDirname}/${fileBasenameNoExtension}",
            "preLaunchTask": "g++ build active file",
            "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항목의 string과 tasks.json의 task label의 string이 동일해야 한다는 점입니다. 디버깅에 앞서 빌드/컴파일을 먼저 수행하기 때문입니다.
  • 파일을 저장한 뒤 VSCode를 종료하고 다시 실행해서 모든 환경설정이 적절히 load 되도록 합시다.
  • 이제 모든 준비가 끝났습니다. F5를 눌러서 디버깅을 실행해봅시다.
  • DEBUG CONSOLE의 저희가 설정한 name대로 탭이 생성되며 GDB가 실행됩니다.
  • 올바르게 변수명과 값이 확인됩니다. stdio를 통합 입력 출력값은 TERMINAL 터미널 탭에서 확인 가능합니다.

3. 마무리

  • WSL2 덕분에 드디어 C++유목민 생활에서 벗어나게 되어 기쁩니다!!
    • VMWare우분투 설치하고 거기서 Visual studio로 코딩하기도 하고
    • Repl.it, 구름IDE같은 온라인 IDE 오고다니기도 하고
      • Repl.it - 현존하는 온라인 IDE중에 가장 좋다고 자신합니다.
        근데 테마, 폰트 변경 못하는거 너무...너무 거슬렸습니다...
        그게 중한게 아니라는 걸 알면서도 한 번 거슬리기 시작하니...
      • 구름 IDE - 국내 IDE에 성능도 좋고 여러모로 IDE 본질에 충실한 점이 맘에 쏙 듭니다. 근데 인텔리센스(intellisense)가 없고 notepad++급의 자동완성이라는 점이 아쉽습니다...심지어 notepad++도 인텔리센스를 지원하는데...
    • 라즈베리파이4 들고다니면서 Dev C++로 코딩하기도 했습니다.
      • 아직 ARM64를 위한 C/C++ Visual studio나 VSCode는 없습니다.
      • 와인으로 가상 윈도우 XP로 Dev C++ 설치해서 썼는데 '대체 내가 지금 뭐하고 있는거지' 생각이 들었습니다.
    • 뭐 하나 맘에 드는 게 없네요...엄청 삽질한 덕분에 데비안 리눅스에 엄청 익숙해졌습니다.
  • 수정할 내용 있으면 수정하겠습니다.
profile
임베디드 시스템 공학자를 지망하는 컴퓨터공학+전자공학 복수전공 학부생입니다. 타인의 피드백을 수용하고 숙고하고 대응하며 자극과 반응 사이의 간격을 늘리며 스스로 반응을 컨트롤 할 수 있는 주도적인 사람이 되는 것이 저의 20대의 목표입니다.

2개의 댓글

comment-user-thumbnail
2020년 7월 19일

좋은 글 잘봤읍니다 ^^

답글 달기
comment-user-thumbnail
2021년 5월 29일

좋은 글 감사합니다 :)

답글 달기