티스토리 뷰

 

 

VSCode에서 C/C++ 코드를 실행하기 위해서는 별도의 설정 과정이 필요하다. 하다가 던져버릴 뻔 했지만 아무튼 성공했으므로 이 좌충우돌 과정을 공유해보려고 한다. 

 

 

진행 순서는 다음과 같다. 

1. C/C++ 컴파일러 설치

2. VSCode에서 C/C++ Extenstion 설치

3. JSON 파일 설정

    c_cpp_properties.json 파일

    tasks.json 파일

4. 단축키 설정

5. 컴파일 및 실행

6. 디버깅 설정

 

 

1. C/C++ 컴파일러 설치 

VSCode에서 C/C++ 소스코드를 컴파일하기 위한 컴파일러를 별도로 설치해야 한다. 보통 C에는 gcc, C++에는 g++ 컴파일러가 사용된다. mingw, msys2, cygwin 프로그램을 통해 컴파일러를 설치할 수 있는데 찾아보니 프로그램 크기는 mingw < msys2 < cygwin 순이라고 하며 뒤로 갈수록 리눅스 표준 라이브러리를 더 제공해주는 듯하다. 나는 처음 본 블로그 글에서 msys2를 사용하길래 그대로 설치를 진행했다. 결국 msys2에서도 mingw를 설치하는 과정이 있기때문에 특별한 이유가 아니라면 mingw로 진행하는 것이 더 좋을 듯하다. 이 글에서는 mingw로 설치를 진행할 것이다. msys2로 컴파일러 설치하기

 

먼저 해당 웹사이트에서 mingw-get-setup.exe 파일을 다운로드 받고 설치를 진행한다. exe 파일을 실행시키면 다음과 같이 설치 관리창이 뜬다. 

 

Install 버튼 클릭

 

Continue 버튼 클릭

 

설치 진행

 

다음 4개의 패키지를 설치해야 한다. 

✅ mingw-deveoper-toolkit

✅ mingw32-base

✅ mingw32-gcc-g++

✅ msys-base

 

각 패키지를 클릭한 후 Mark for Inatallation 메뉴를 다시 클릭하여 설치할 패키지 총 4개를 선택한다.

 

Installation -> Apply Changes 메뉴 클릭

 

Apply 버튼 클릭

 

 

선택한 4개의 패키지 설치 완료

 

 

아래와 같이 설치 경로(C:\MinGW\bin)에 exe 파일들이 설치된 것을 확인할 수 있다. 

 

 

다음으로 설치 경로를 환경변수에 등록해주어야 한다. 그래야 어디서든 gcc, g++ 이라는 명령어 이름만으로 명령어를 실행시킬 수 있다. 만약 환경변수에 등록해주지 않으면 C:\MinGW\bin\gcc, C:\MinGW\bin\g++ 같이 명령어의 절대경로를 모두 적어주어야 한다. 윈도우 + r 단축키로 실행창을 열고 sysdm.cpl 메뉴를 연다. 

 

다음과 같이 고급 탭환경 변수 메뉴를 클릭하여 환경 변수 편집창을 연다. 

 

 

시스템 변수의 Path를 찾아 더블 클릭하거나 편집 버튼을 누른 뒤 다음과 같이 설치 경로를 추가해준다,

 

mingw를 설치할 때 별도로 만진 것이 없다면 기본 설치 경로는 C:\MinGW\bin 이다. 

 

 

환경 변수가 잘 설정되었는지 확인해보자. 

환경 변수 추가 이전에는 gcc, g++, gdb 명령어에 대해 다음과 같은 결과가 출력되었지만

 

추가 이후에는 다음과 같이 출력된다. 

 

 

 

2. VSCode에서 C/C++ Extenstion 설치 

VSCode에서 해당 Extenstion을 설치한다. 위 스크린 샷은 설치 완료 이후로 설치 전에는 install 버튼이 활성화 되어있는 상태이다. 

 

 

 

3. JSON 파일 설정 

앞으로 설정할 JSON 파일들은 모두 .vscode 폴더 아래에 위치한다. 

 

c_cpp_properties.json 파일

F1을 눌러 C/C++: Edit Configurations (JSON)을 클릭하면 c_cpp_properties.json 파일이 자동으로 생성된다.

 

F1 메뉴창

 

기본 생성된 c_cpp_properties.json 파일

 

c_cpp_properties.json 파일을 다음과 같이 수정한다. 

{
  "configurations": [
    {
      "name": "Win32",
      "includePath": ["${workspaceFolder}/**", "C:/MinGW/include"], //자신의 환경에 맞게 수정
      "defines": ["_DEBUG", "UNICODE", "_UNICODE"],
      "windowsSdkVersion": "10.0.19041.0",
      "compilerPath": "C:/MinGW/bin/g++.exe", //자신의 환경에 맞게 수정
      "cStandard": "c17",
      "cppStandard": "c++17",
      "intelliSenseMode": "windows-gcc-x64" 
    }
  ],
  "version": 4
}
 
includePath, compilerPath, intelliSenseMode 값을 위와 같이 변경하면 된다. 만약 mingw 설치 시 기본 경로를 변경했다면 자신의 변경 사항에 맞춰 경로를 수정한다. 음 사실 시스템 환경 변수에 컴파일러 경로를 추가해주었기 때문에 c_cpp_properties.json 파일을 따로 설정해주지 않아도 잘 동작하였다. 왜 해당 설정이 필요한지는 잘 모르겠다...

 

 

tasks.json 파일 

빌드를 위한 task를 정의하는 tasks.json 파일도 생성해주어야 한다.

F1을 눌러 Tasks: Configure TaskCreate tasks.json file from templateOthers 선택하면 tasks.json 파일이 자동으로 생성된다.

F1 메뉴창

 

기본 생성된 tasks.json 파일

 

 

다음과 같이 내용을 수정한다. 

{
  "version": "2.0.0",
  "runner": "terminal",
  "tasks": [
    //C++ 컴파일
    {
      "type": "shell",
      "label": "g++ build", //자신이 원하는 이름으로 수정 
      "command": "g++",
      "args": [
        "-g",
        "${file}",
        "-o",
        "${workspaceFolder}\\build\\${fileBasenameNoExtension}.exe" //자신이 원하는 컴파일 결과 경로로 수정
      ],
      "problemMatcher": ["$gcc"],
      "group": {
        "kind": "build",
        "isDefault": true //자신이 원하는 기본 작업에 true 값 설정 
      }
    },
    //C 컴파일
    {
      "type": "shell",
      "label": "gcc build", //자신이 원하는 이름으로 수정 
      "command": "gcc",
      "args": [
        "-g",
        "${file}",
        "-o",
        "${workspaceFolder}\\build\\${fileBasenameNoExtension}.exe" //자신이 원하는 컴파일 결과 경로로 수정
      ],
      "problemMatcher": ["$gcc"],
      "group": {
        "kind": "build",
        "isDefault": false //자신이 원하는 기본 작업에 true 값 설정 
      }
    },
    //실행
    {
      "label": "execute", //자신이 원하는 이름으로 수정 
      "command": "cmd",
      "group": "test",
      "args": [
        "/C",
        "${workspaceFolder}\\build\\${fileBasenameNoExtension}.exe" //위에서 설정한 컴파일 결과 경로로 지정
      ]
    }
  ]
}

여기서 ${}로 감싸진 변수는 vscode에서 기본적으로 제공하는 변수이다. ${workspaceFolder}는 현재 워크스페이스의 경로를 ${fileBasenameNoExtension}은 현재 선택된 파일 이름에서 확장자를 제외한 부분을 의미한다. 만약 현재 워크스페이스 경로가 C:/Users/PC/Algorithm 이라면 ${workspaceFolder} 값은 C:/Users/PC/Algorithm을, C:/Users/PC/Algorithm/queue123.cpp 파일을 선택했다면 ${fileBasenameNoExtension} 값은 queue123이다. (자세한 내용은 다음을 참고)

 

tasks.json에서 각 설정 값의 의미는 다음과 같다. 

 

label 

task에 대한 이름으로 task 선택 시 사용자에게 다음과 같이 보여진다. 

build 그룹에 속한 tasks (위에서 설정한 g++ build, gcc build 포함)

 

command

해당 task에서 수행할 명령어로 C++ 컴파일을 위한 명령어로는 g++, C 컴파일을 위한 명령어로는 gcc를 설정한다.

 

args

명령어 뒤 인자를 정의하는 것으로 예를 들어 g++ build 작업의 경우 다음과 같은 명령어가 실행되는 것을 의미한다. 

g++ -g ${file} -o ${workspaceFolder}\\build\\${fileBasenameNoExtension}.exe

 

problemMatcher

컴파일 에러가 C/C++ extension에 맞추어 출력되도록 설정한다. 

 

group

해당 task를 해당 그룹에서 관리, 즉 g++ compile, gcc compile 작업은 build 라는 그룹에서 관리하여 단축키로 build 명령  수행 시 build 그룹에 속한 작업 중 하나가 실행된다. 만약 그룹 안에 여러 task가 존재하면 그 중 하나를 사용자가 직접 선택하며 "isDefault": true로 기본적으로 실행되는 task를 지정할 수도 있다. (위 설정의 경우 g++ compile 작업이 기본적으로 실행됨) 

 

 

보통 args의 마지막 인자로 "${fileDirName}\\${fileBasenameNoExtension}.exe" 값을 설정하는데 나는 워크스페이스 폴더 내에 알고리즘 별로 폴더를 만들었고 이 경우 "${fileDirName}\\${fileBasenameNoExtension}.exe" 값을 설정하게 되면 알고리즘 폴더 내에 .cpp, .exe 파일이 섞이게 된다. 따라서 워크스페이스 폴더 내에 별도의 build 폴더를 생성하여 해당 폴더 안에서 모든 .exe 파일을 관리하는 것이 더 좋을 것 같아 해당 값을 "${workspaceFolder}\\build\\${fileBasenameNoExtension}.exe"로 바꿔주었다.

 

workspaceFolder 아래의 build 폴더

 

 

 

4. 단축키 설정

F1Preferences: Open Keyboard Shortcuts (Json) keybindings.json 파일을 편집한다. 

컴파일 단축키는 Ctrl + Alt + c로, 실행은 Ctrl + Alt + r로 변경하였다. 기존 workbench.action.tasks.build 단축키는 Ctrl + Shift + b, workbench.action.tasks.test에는 단축키가 할당되어있지 않다고 한다.

파일에 다음 내용을 추가하면 된다.

[
  // 컴파일
  {
    "key": "ctrl+alt+c",
    "command": "workbench.action.tasks.build"
  },
  // 실행
  {
    "key": "ctrl+alt+r",
    "command": "workbench.action.tasks.test"
  }
]

 

 

 

5. 컴파일 및 실행 

이제 .cpp 파일이 제대로 컴파일되고 실행되는지 확인해보자. 

#include <iostream>

using namespace std;

int main() {
    cout << "Hello World!" << "\n";
    
    return 0; 
}

 

간단한 소스 코드를 작성하고 단축키로 컴파일하고 실행해보았다. 첫번째 파란색 동그라미 부분은 컴파일 결과를, 두번째 파란색 동그라미 부분은 실행 결과를 의미한다. 

 

컴파일 결과 build 폴더 아래 .exe 파일이 생성되었다. 

 

만약 컴파일 시 오류가 발생하면 다음과 같이 오류 메시지가 출력된다. 

 

 

 

6. 디버깅 설정

디버깅을 하지 않을 분들은 지금까지의 설정만으로도 vscode에서 C/C++ 코드를 동작시킬 수 있다. 하지만 디버깅이 필요하다면 아래의 추가 설정이 더 필요하다...

 

실행(F5)C++ (GDB/LLDB)g++.exe build and debug active file 메뉴를 클릭하면 다음과 같이 launch.json 파일이 자동 생성된다.

 

F5 메뉴창

 

C++ (GDB/LLDB) 메뉴창

 

기본 생성된 launch.json 파일

 

launch.json 파일이 자동 생성되면서 tasks.json 파일 끝에 C/C++: g++.exe build active file 작업이 추가될 수 있다. 해당 작업은 위에서 정의한 작업과 비슷하기 때문에 삭제해도 무방하다.

 

launch.json 파일 내용을 다음과 같이 수정해준다. preLaunchTask 값으로 tasks.json에서 설정한 build 그룹 작업 중 하나의 label 값을 지정해준다. 지정해줌으로써 먼저 g++ build 작업을 수행하여 컴파일 후 디버깅이 진행된다. 만약 preLaunchTask를 지정해주지 않는다면 디버깅 전 일일이 직접 컴파일해야 한다. 

{
  // Use IntelliSense to learn about possible attributes.
  // Hover to view descriptions of existing attributes.
  // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
  "version": "0.2.0",
  "configurations": [
    {
      "name": "g++.exe build and debug active file", //자신이 원하는 이름으로 수정
      "type": "cppdbg",
      "request": "launch",
      "program": "${workspaceFolder}\\build\\${fileBasenameNoExtension}.exe", //위에서 설정한 컴파일 결과 경로로 지정
      "args": [],
      "stopAtEntry": false,
      "cwd": "${workspaceFolder}",
      "environment": [],
      "externalConsole": false,
      "MIMode": "gdb",
      "miDebuggerPath": "C:\\MinGW\\bin\\gdb.exe", //자신의 환경에 맞게 수정
      "setupCommands": [
        {
          "description": "Enable pretty-printing for gdb",
          "text": "-enable-pretty-printing",
          "ignoreFailures": true
        }
      ],
      "preLaunchTask": "g++ build" //디버깅 전 실행할 작업 label 지정
    }
  ]
}

 

 

그럼 이제 F9으로 중단점(breakpoint)을 찍고 F5로 디버깅을 해보자. 다음과 같이 잘 실행된다. 

 

 

 

끝.

 

 

 

인줄 알았지만... 파일 경로에 한글이 들어가면 디버깅이 제대로 실행되지 않는다... 이건 차차 문제를 해결해보고 추후에 내용을 추가할 것이다.

 

 

 

참고

https://jhnyang.tistory.com/430

https://jhnyang.tistory.com/440

https://veggie-garden.tistory.com/36

 

'C++' 카테고리의 다른 글

[개념] C++의 형변환 연산자  (0) 2022.07.02
[개념] C++의 다형성 - virtual 함수  (0) 2022.06.27
[개념] C++의 상속 3계명?  (0) 2022.06.24
[개념] C++의 복사 생성자  (0) 2022.06.22
[개념] C++의 멤버 이니셜라이저  (0) 2022.06.20
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함