Linux에서 VS Code를 사용하여 C++ 사용하기
이 튜토리얼에서는 Visual Studio Code를 구성하여 Linux에서 GCC C++ 컴파일러(g++) 및 GDB 디버거를 사용합니다. GCC는 GNU 컴파일러 컬렉션을 의미하며, GDB는 GNU 디버거입니다.
VS Code를 구성한 후에는 VS Code에서 간단한 C++ 프로그램을 컴파일하고 디버그합니다. 이 튜토리얼은 GCC, GDB, Ubuntu 또는 C++ 언어를 가르치지 않습니다. 해당 주제에 대해서는 웹에서 많은 유용한 리소스를 찾을 수 있습니다.
문제가 발생하면 이 튜토리얼에 대한 이슈를 VS Code 설명서 리포지토리에 자유롭게 제출하십시오.
전제 조건
이 튜토리얼을 성공적으로 완료하려면 다음을 수행해야 합니다.
-
Visual Studio Code를 설치합니다.
-
VS Code용 C++ 확장을 설치합니다. 확장 보기(⇧⌘X (Windows, Linux Ctrl+Shift+X))에서 'c++'를 검색하여 C/C++ 확장을 설치할 수 있습니다.

GCC가 설치되어 있는지 확인
소스 코드를 편집하는 데 VS Code를 사용하지만, Linux에서는 g++ 컴파일러를 사용하여 소스 코드를 컴파일합니다. 디버그하는 데 GDB도 사용합니다. 이러한 도구는 Ubuntu에 기본적으로 설치되어 있지 않으므로 설치해야 합니다. 다행히 이는 쉽습니다.
먼저 GCC가 이미 설치되어 있는지 확인합니다. 설치되어 있는지 확인하려면 터미널 창을 열고 다음 명령을 입력합니다.
gcc -v
GCC가 설치되어 있지 않으면 터미널 창에서 다음 명령을 실행하여 Ubuntu 패키지 목록을 업데이트합니다. 오래된 Linux 배포판은 새 패키지 설치 시도에 때때로 방해가 될 수 있습니다.
sudo apt-get update
다음으로 이 명령으로 GNU 컴파일러 도구와 GDB 디버거를 설치합니다.
sudo apt-get install build-essential gdb
Hello World 만들기
터미널 창에서 VS Code 프로젝트를 저장할 projects라는 빈 폴더를 만듭니다. 그런 다음 helloworld라는 하위 폴더를 만들고 해당 폴더로 이동한 다음 다음 명령을 입력하여 해당 폴더에서 VS Code를 엽니다.
mkdir projects
cd projects
mkdir helloworld
cd helloworld
code .
code . 명령은 현재 작업 폴더에서 VS Code를 엽니다. 이 폴더는 "작업 영역"이 됩니다. 튜토리얼을 진행하면서 작업 영역의 .vscode 폴더에 세 개의 파일을 만들게 됩니다.
tasks.json(컴파일러 빌드 설정)launch.json(디버거 설정)c_cpp_properties.json(컴파일러 경로 및 IntelliSense 설정)
hello world 소스 코드 파일 추가
파일 탐색기 제목 표시줄에서 새 파일을 선택하고 파일 이름을 helloworld.cpp로 지정합니다.

다음 소스 코드를 붙여넣습니다.
#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;
return 0;
}
이제 ⌘S (Windows, Linux Ctrl+S)를 눌러 파일을 저장합니다. 파일이 VS Code의 사이드바에 있는 **파일 탐색기** 보기(⇧⌘E (Windows, Linux Ctrl+Shift+E))에 나열되어 있는 것을 확인합니다.

기본 **파일** 메뉴에서 자동 저장을 선택하여 자동 저장을 활성화하여 파일 변경 사항을 자동으로 저장할 수도 있습니다.
Visual Studio Code 가장자리에 있는 활동 표시줄을 사용하면 **검색**, **소스 제어**, **실행**과 같은 다른 보기를 열 수 있습니다. 이 튜토리얼의 뒷부분에서 **실행** 보기를 살펴보겠습니다. 다른 보기에 대해 자세히 알아보려면 VS Code 사용자 인터페이스 설명서를 참조하십시오.
참고: C++ 파일을 저장하거나 열 때 C/C++ 확장에서 Insiders 버전을 사용할 수 있다는 알림이 표시될 수 있습니다. 이 버전은 새로운 기능과 수정을 테스트할 수 있습니다.
X(알림 지우기)를 선택하여 이 알림을 무시할 수 있습니다.
IntelliSense 탐색
helloworld.cpp 파일에서 vector 또는 string 위에 마우스를 올리면 유형 정보를 볼 수 있습니다. msg 변수 선언 후 msg.를 입력하기 시작하면 멤버 함수를 호출할 때처럼 즉시 멤버 함수를 모두 보여주는 완성 목록과 msg 개체의 유형 정보를 보여주는 창이 나타납니다.

선택한 멤버를 삽입하려면 Tab 키를 누릅니다. 그런 다음 열린 괄호를 추가하면 함수에 필요한 인수에 대한 정보가 표시됩니다.
helloworld.cpp 실행
C++ 확장은 설치된 C++ 컴파일러를 사용하여 프로그램을 빌드합니다. VS Code에서 helloworld.cpp를 실행하고 디버그하기 전에 C++ 컴파일러가 설치되어 있는지 확인하십시오.
-
helloworld.cpp를 열어 활성 파일로 만듭니다. -
편집기 오른쪽 상단에 있는 재생 버튼을 누릅니다.

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

helloworld.cpp를 처음 실행할 때만 컴파일러를 선택하라는 메시지가 표시됩니다. 이 컴파일러는 tasks.json 파일에 "기본" 컴파일러로 설정됩니다.
-
빌드가 성공하면 프로그램의 출력이 통합 **터미널**에 표시됩니다.

프로그램을 처음 실행하면 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을 수정하여 "${file}" 대신 "${workspaceFolder}/*.cpp"와 같은 인수를 사용하여 여러 C++ 파일을 빌드할 수 있습니다. 이렇게 하면 현재 폴더의 모든 .cpp 파일이 빌드됩니다. "${fileDirname}/${fileBasenameNoExtension}"을 하드코딩된 파일 이름(예: 'helloworld.out')으로 바꾸어 출력 파일 이름을 수정할 수도 있습니다.
helloworld.cpp 디버그
코드를 디버그하려면
helloworld.cpp로 돌아가 활성 파일로 만듭니다.- 편집기 여백을 클릭하거나 현재 줄에서 F9를 사용하여 중단점을 설정합니다.

- 재생 버튼 옆에 있는 드롭다운 메뉴에서 C/C++ 파일 디버그를 선택합니다.

- 시스템에서 감지된 컴파일러 목록에서 C/C++: g++ 빌드 및 디버그 활성 파일을 선택합니다(
helloworld.cpp를 처음 실행하거나 디버그할 때만 컴파일러를 선택하라는 메시지가 표시됩니다).
재생 버튼에는 **C/C++ 파일 실행**과 **C/C++ 파일 디버그** 두 가지 모드가 있습니다. 마지막으로 사용한 모드로 기본 설정됩니다. 재생 버튼에 디버그 아이콘이 보이면 드롭다운 메뉴 항목을 선택하는 대신 재생 버튼을 선택하여 디버그할 수 있습니다.
디버거 탐색
코드를 단계별로 실행하기 전에 사용자 인터페이스의 몇 가지 변경 사항을 잠시 살펴보겠습니다.
-
통합 터미널이 소스 코드 편집기 하단에 나타납니다. **디버그 출력** 탭에서 디버거가 실행 중임을 나타내는 출력이 표시됩니다.
-
편집기는 이전에 디버거를 시작하기 전에 설정한 중단점인 12번 줄을 강조 표시합니다.

-
왼쪽에 있는 **실행 및 디버그** 보기에 디버깅 정보가 표시됩니다. 튜토리얼 뒷부분에서 예시를 볼 수 있습니다.
-
코드 편집기 상단에 디버깅 제어 패널이 나타납니다. 왼쪽의 점을 잡아서 화면 주위로 이동할 수 있습니다.

작업 영역에 이미 launch.json 파일이 있는 경우, 재생 버튼은 C++ 파일을 실행하고 디버그할 때 이 파일에서 읽어옵니다. launch.json이 없는 경우, 재생 버튼은 즉석에서 임시 "빠른 디버그" 구성을 생성하여 launch.json을 완전히 생략합니다!
코드 단계별 실행
이제 코드를 단계별로 실행할 준비가 되었습니다.
-
디버깅 제어 패널에서 **건너뛰기** 아이콘을 클릭하거나 누릅니다.

이렇게 하면 프로그램 실행이 for 루프의 첫 번째 줄로 이동하고,
msg변수가 생성되고 초기화될 때 호출되는vector및string클래스의 모든 내부 함수 호출을 건너뜁니다. 측면의 **변수** 창의 변경 사항을 확인합니다.
-
**건너뛰기**를 다시 눌러 다음 문으로 이동합니다(루프 초기화를 위해 실행되는 모든 내부 코드를 건너뜁니다). 이제 **변수** 창에 루프 변수에 대한 정보가 표시됩니다.
-
**건너뛰기**를 다시 눌러
cout문을 실행합니다(C++ 확장은 마지막 cout가 실행될 때까지 **디버그 콘솔**에 출력을 인쇄하지 않습니다.). -
원하는 경우 **건너뛰기**를 계속 눌러 벡터의 모든 단어가 콘솔에 인쇄될 때까지 실행할 수 있습니다. 하지만 궁금하다면 **단계별 실행** 버튼을 눌러 C++ 표준 라이브러리의 소스 코드를 단계별로 실행해 보세요!

자신의 코드로 돌아가려면 **건너뛰기**를 계속 누르는 것이 한 가지 방법입니다. 다른 방법은 코드 편집기에서
helloworld.cpp탭으로 전환하여 루프 안의cout문에 삽입 지점을 놓고 F9를 눌러 코드에 중단점을 설정하는 것입니다. 왼쪽에 있는 여백에 빨간색 점이 나타나 이 줄에 중단점이 설정되었음을 나타냅니다.
그런 다음 F5를 눌러 표준 라이브러리 헤더의 현재 줄부터 실행을 시작합니다. 실행은
cout에서 중단됩니다. 원하는 경우 F9를 다시 눌러 중단점을 해제할 수 있습니다.루프가 완료되면 통합 터미널의 **디버그 콘솔** 탭에서 GDB가 출력하는 다른 진단 정보와 함께 출력을 볼 수 있습니다.

감시 설정
프로그램 실행 중에 변수 값을 추적하려면 해당 변수에 **감시**를 설정합니다.
-
삽입 지점을 루프 안에 놓습니다. **감시** 창에서 더하기 기호를 클릭하고 텍스트 상자에 루프 변수 이름인
word를 입력합니다. 이제 루프를 단계별로 실행하면서 감시 창을 확인합니다.
-
중단점에서 실행이 일시 중지된 동안 변수 값을 빠르게 보려면 마우스 포인터로 해당 변수 위로 가져가면 됩니다.

다음으로 VS Code에 프로그램을 빌드(컴파일)하는 방법을 알리는 tasks.json 파일을 만듭니다. 이 작업은 g++ 컴파일러를 호출하여 소스 코드에서 실행 파일을 생성합니다.
다음 단계에서 빌드 작업을 생성하기 위해 다음 단계에서 편집기의 활성 파일을 사용하므로 helloworld.cpp가 편집기에서 열려 있는지 확인하는 것이 중요합니다.
launch.json으로 디버깅 사용자 지정
재생 버튼 또는 F5로 디버그할 때 C++ 확장은 즉석에서 동적 디버그 구성을 생성합니다.
런타임에 프로그램에 전달할 인수를 지정하는 것과 같이 디버그 구성을 사용자 지정하려는 경우가 있습니다. launch.json 파일에 사용자 지정 디버그 구성을 정의할 수 있습니다.
launch.json을 만들려면 재생 버튼 드롭다운 메뉴에서 디버그 구성 추가를 선택합니다.

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

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를 볼 수 있습니다.

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

프로그램이 작업 영역이나 표준 라이브러리 경로에 없는 헤더 파일을 포함하는 경우에만 **포함 경로** 설정을 수정하면 됩니다.
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
}
C++ 구성 재사용
이제 VS Code는 Linux에서 gcc를 사용하도록 구성되었습니다. 구성은 현재 작업 영역에 적용됩니다. 구성을 재사용하려면 JSON 파일을 새 프로젝트 폴더(작업 영역)의 .vscode 폴더에 복사하고 필요한 경우 소스 파일 및 실행 파일의 이름을 변경하면 됩니다.
문제 해결
컴파일러 및 링커 오류
가장 일반적인 오류 원인(예: undefined _main 또는 attempting to link with file built for unknown-unsupported file format 등)은 빌드를 시작하거나 디버깅을 시작할 때 helloworld.cpp가 활성 파일이 아닌 경우 발생합니다. 이는 컴파일러가 소스 코드가 아닌 launch.json, tasks.json 또는 c_cpp_properties.json 파일과 같은 것을 컴파일하려고 하기 때문입니다.
다음 단계
- VS Code 사용자 가이드를 탐색합니다.
- C++ 확장 개요를 검토합니다.
- 새 작업 영역을 만들고 .json 파일을 복사한 다음 새 작업 영역 경로, 프로그램 이름 등에 대한 필요한 설정을 조정하고 코딩을 시작하세요!