반응형

Visual Studio Code와 WSL ( Windows Subsystem for Linux  ) 를 연결하여 C/C++ 컴파일 및 디버깅하는 방법을 다룹니다. 



2021. 5 .23 최초작성

2021. 8. 1



윈도우에 Visual Studio Code를 설치합니다. 

 

Visual Studio Code 설치하는 방법( Windows / Ubuntu )

https://webnautes.tistory.com/1197



Visual Studio Code를 실행하여 확장에서 Remote - WSL을 설치합니다.

 



wsl을 설치합니다. 

 

WSL 2 ( Windows Subsystem for Linux ) 를 사용하여 Ubuntu 20.04 설치 하는 방법

https://webnautes.tistory.com/1170 



wsl 우분투를 실행합니다.

 



wsl에서 빌드 관련 패키지를 설치합니다. 

 

webnautes@DESKTOP-8V6I02P:~$ sudo apt-get install build-essential gdb



wsl에서 다음처럼 디렉토리를 생성합니다.

 

webnautes@DESKTOP-8V6I02P:~$ mkdir projects

webnautes@DESKTOP-8V6I02P:~$ cd projects

webnautes@DESKTOP-8V6I02P:~/projects$ mkdir helloworld

 

프로젝트 폴더로 이동합니다.

 

webnautes@DESKTOP-8V6I02P:~/projects$ cd helloworld



code를 실행합니다.

 

webnautes@DESKTOP-8V6I02P:~/projcets/helloworld$  code .

Installing VS Code Server for x64 (2b9aebd5354a3629c3aba0a5f5df49f43d6689f8)

Downloading: 100%

Unpacking: 100%

Unpacked 1824 files and folders to /home/webnautes/.vscode-server/bin/2b9aebd5354a3629c3aba0a5f5df49f43d6689f8.



code가 실행되면서 디렉토리 이름 HELLOWORLD 옆에 WSL:UBUNTU 20.04가 표시됩니다. 

 



새파일 아이콘을 클릭하여 hello.cpp 파일을 생성합니다. 

C언어도 가능할 것으로 보입니다. 

 




오른쪽 아래에 C/C++ 확장 권장 메시지 박스가 보이면 Install 또는 설치를 클릭하여 설치합니다.



다음 코드를 입력합니다. 

#include <stdio.h>


int main()

{
    printf("Hello, world!\n");

    return 0;
}



소스 코드를 선택한 상태에서  Visual Studio Code의 메뉴에서 터미널 > 기본 빌드 작업 구성을 선택합니다.

 

폴더에서 사용하는 언어에 맞추어 선택하세요.(안 보일 수도 있습니다.)

사용하는 언어가 C이면 gcc, 사용하는 언어가 C++이면 g++을 선택해주세요. 

하나의 폴더에서 두 언어 다 사용하는 경우에는 g++을 선택해도 무방한 듯합니다.  

 

템플릿에서 tasks.json 파일 만들기를 선택합니다.

 

Others를 선택합니다.

 

탐색기의 .vscode 폴더에   tasks.json 파일이 추가되고 편집기에서 해당 파일이 열립니다.

 

tasks.json 내용을 다음으로 교체하고 Ctrl + S를 눌러서 저장합니다.

{
    "version": "2.0.0",
    "runner": "terminal",
    "type": "shell",
    "echoCommand": true,
    "presentation" : { "reveal": "always" },
    "tasks": [
          //C++ 컴파일
          {
            "label": "save and compile for C++",
            "command": "g++",
            "args": [
                "${file}",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}"
            ],
            "group": "build",

            //컴파일시 에러를 편집기에 반영
            //참고:   https://code.visualstudio.com/docs/editor/tasks#_defining-a-problem-matcher

            "problemMatcher": {
                "fileLocation": [
                    "relative",
                    "${workspaceRoot}"
                ],
                "pattern": {
                    // The regular expression. 
                   //Example to match: helloWorld.c:5:3: warning: implicit declaration of function 'prinft'
                    "regexp": "^(.*):(\\d+):(\\d+):\\s+(warning error):\\s+(.*)$",
                    "file": 1,
                    "line": 2,
                    "column": 3,
                    "severity": 4,
                    "message": 5
                }
            }
        },
        //C 컴파일
        {
            "label": "save and compile for C",
            "command": "gcc",
            "args": [
                "${file}",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}"
            ],
            "group": "build",

            //컴파일시 에러를 편집기에 반영
            //참고:   https://code.visualstudio.com/docs/editor/tasks#_defining-a-problem-matcher

            "problemMatcher": {
                "fileLocation": [
                    "relative",
                    "${workspaceRoot}"
                ],
                "pattern": {
                    // The regular expression. 
                   //Example to match: helloWorld.c:5:3: warning: implicit declaration of function 'prinft'
                    "regexp": "^(.*):(\\d+):(\\d+):\\s+(warning error):\\s+(.*)$",
                    "file": 1,
                    "line": 2,
                    "column": 3,
                    "severity": 4,
                    "message": 5
                }
            }
        },
        //바이너리 실행(Ubuntu)
         {
             "label": "execute",
             "command": "${fileDirname}/${fileBasenameNoExtension}",
             "group": "test"
         }
    ]
}

 

단축키를 설정해줍니다.   메뉴에서 파일 > 기본 설정 > 바로 가기 키를 선택합니다. 

이미 설정되어 있는 단축키 목록을 보여줍니다. 

사용자 정의로 바로 가기 키를 추가해야 합니다. 캡처화면에 빨간색 사각형으로 표시한 아이콘을 클릭합니다.

 

5다음처럼 입력하고 Ctrl + S를 눌러서 저장합니다. 기본값을 무시하고 현재 입력한 값이 우선 적용됩니다.

(단 우분투의 경우 데스크톱 환경의 단축키가 우선입니다. 다른 곳에서 사용하지 않는 단축키를 사용해야 합니다.)

 

// 키 바인딩을 이 파일에 넣어서 기본값을 덮어씁니다.
[
    //컴파일
    { "key": "ctrl+alt+c", "command": "workbench.action.tasks.build" },
    
    //실행
    { "key": "ctrl+alt+r", "command": "workbench.action.tasks.test" }
]

 

 

탐색기에서 hello.cpp를 선택하고 Ctrl +Alt + C를 누르면 보이는 항목에서 save and compile for C++를 선택합니다.

 

편집 중이던 모든 파일 저장되고 앞에서 터미널에 컴파일 진행결과가 보입니다.

문제없이 컴파일이 진행되어다면 왼쪽 탐색기에 컴파일 결과물인 hello 파일이 보입니다. 

 

Ctrl  + Alt + R을 누르면 보이는 execute를 선택합니다.

 

실행 결과가 터미널에 보여집니다.

 

디버깅

진행하기 전에 위에서 작업했던 일부를 수정해야 합니다. 

프로젝트 폴더의 .vscode 폴더에 있는 tasks.json 파일을 열어서 컴파일 시 디버그 정보를 포함하도록 합니다. 

 

 

테스트 해보기 위해서 새로운 하위 폴더를 생성하여  add.cpp 파일을 추가합니다.

 

#include <iostream>

using namespace std;

int c = 0;
int d = 100;

int main()
{
    int a = 2;
    int b = 2;
    int c = a + b;

    cout << a << " + " << b << " = " << c << endl;

    return 0;
}

 

 

확장에서 C++를 검색한 후, C/C++ 항목을 선택한 후 WSL: Ubuntu 20.04에 설치를 클릭합니다.

 

이미 적용되어 다음처럼 보일 수도 있습니다.

 

 

숫자 5 왼쪽으로 마우스 커서를 이동 후. 마우스 왼쪽 버튼을 클릭하면 빨간점이 표시됩니다.

디버깅이 시작되면 잠시 멈추게되는 브레이크 포인트입니다. 

 

F5를 누릅니다.

 

C++(GDB/LLDB)를 선택합니다.

 

컴파일러 경로가 /usr/bin/g++인 g++를 선택합니다. 

 

잠시 기다리면 디버깅이 시작됩니다. 

F11을 눌러서 다음 줄이 실행되게 할 수 있습니다. 

왼쪽에 보이는 변수 창에 지역 변수가 업데이트 됩니다. 

 

 

 

이후에는 브레이크 포인트를 지정하고 F5를 누르면  디버깅이 시작됩니다. 

 

main함수 에서 사용하는 전역 변수 c는 변수 항목의 Locals에 추가되었는데 

전역변수 d의 경우에는 추가되어 있지 않습니다. 

 

이 경우 조사식에 마우스 커서를 가져가면 보이는 + 아이콘을 클릭하고 

 

추가할 변수 이름을 입력후 엔터를 누르면

 

해당 변수의 값이 보입니다.



 

 

반응형

해본 것을 문서화하여 기록합니다.
부족함이 있지만 도움이 되었으면 합니다.


포스트 작성시에는 문제 없었지만 이후 문제가 생길 수 있습니다.
질문을 남겨주면 가능한 빨리 답변드립니다.


제가 쓴 책도 한번 검토해보세요 ^^

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기

댓글을 달아 주세요

">