VS Code C++ 개발 환경: IntelliSense 빨간 밑줄, tasks.json 빌드, launch.json 디버깅, clangd
[C++ 실전 가이드 #3] VS Code C++ 개발 환경 설정
이 글을 읽으면 VS Code에서 IntelliSense, 빌드 작업, 디버깅을 설정하고 C++ 개발을 바로 시작할 수 있습니다.
💡 핵심 개념: (1) VS Code + C/C++ 확장 설치 → (2)
c_cpp_properties.json에서 터미널과 같은compilerPath지정 → (3)tasks.json으로 빌드 → (4)launch.json으로 F5 디버깅. 2번만 맞춰도 빨간 밑줄이 대부분 사라집니다.
”빌드는 되는데 VS Code에서 빨간 밑줄이 잔뜩 나와요”
VS Code로 C++을 처음 쓸 때 가장 흔한 문제다. 터미널에서는 g++ main.cpp -o main이 잘 되는데, 에디터에서는 <iostream>, <vector> 같은 표준 라이브러리에 빨간 밑줄이 쫙 그어지고, 자동 완성도 제대로 동작하지 않습니다. 원인은 VS Code C++ 확장이 “어느 컴파일러를 쓰며, 어디서 헤더를 찾을지” 모르기 때문입니다. 이 글에서는 이 문제를 해결하고, 빌드·디버깅까지 한 번에 설정하는 방법을 단계별로 설명합니다.
VS Code는 가볍고 강력한 코드 편집기로, C++ 개발에도 매우 적합합니다. 쉽게 말해 “메모장보다 훨씬 똑똑하고, Visual Studio보다 가벼운 중간 단계”라고 보면 됩니다. IntelliSense(코드 자동 완성·함수 시그니처 표시·에러 밑줄 등 편집 시 도움을 주는 기능) 설정, 빌드 자동화, 디버깅 설정까지 모든 과정을 다룬다.
헤더 경로·디버거·빌드 태스크에서 막히는 경우
팀원이 새 PC에서 VS Code 설정
팀원이 새로 합류했는데, 같은 코드베이스를 열었을 때 빨간 밑줄이 잔뜩 나오고 빌드가 안 됩니다. compilerPath가 각자 PC의 설치 경로에 따라 달라지기 때문입니다. .vscode 설정을 Git에 커밋하고, OS별 구성(Windows/Linux/Mac)을 함께 제공하면 해결됩니다.
CMake 프로젝트를 VS Code로 열었는데 IntelliSense가 안 됨
CMakeLists.txt 기반 프로젝트를 열었을 때 #include 경로를 인식하지 못합니다. CMake 확장이 compile_commands.json을 생성하면 자동으로 해결되지만, 확장 미설치나 CMAKE_EXPORT_COMPILE_COMMANDS 미설정 시 수동으로 c_cpp_properties.json을 맞춰야 합니다.
Windows에서 WSL로 Linux C++ 빌드하려면
Windows에서 WSL(Windows Subsystem for Linux) 내부의 g++로 빌드하고 싶을 때, VS Code의 “Remote - WSL” 확장으로 WSL 폴더를 열고, 해당 환경에서 g++/gdb를 사용하도록 설정하면 됩니다. compilerPath는 WSL 내부 경로(예: /usr/bin/g++)를 사용합니다.
디버깅 시 “Could not find the task” 오류
F5로 디버깅을 시작할 때마다 “preLaunchTask ‘C++ Build’ not found”가 뜬다. tasks.json의 label과 launch.json의 preLaunchTask 문자열이 정확히 일치해야 합니다. 대소문자, 공백이 하나라도 다르면 실패합니다.
macOS에서 LLDB 오류
F5를 누르면 “Unable to find debugger” 또는 LLDB 관련 오류가 발생합니다. Xcode Command Line Tools가 설치되지 않았거나, launch.json에서 MIMode가 gdb로 되어 있어서 발생합니다. macOS는 기본 lldb를 사용해야 합니다.
컴파일러(#2)와 빌드 도구(CMake 입문(#4))가 준비되어 있어야 IntelliSense와 빌드 작업이 제대로 동작하므로, 순서대로 진행했다면 이제 편집기만 맞춰 주면 됩니다.
설치부터 디버깅까지 전체 흐름
flowchart TB
subgraph editor[VS Code 에디터]
A[소스 코드 편집]
B[IntelliSense]
end
subgraph config["설정 파일 (.vscode/)"]
C[c_cpp_properties.json]
D[tasks.json]
E[launch.json]
end
subgraph build[빌드 & 실행]
F[g++/clang++]
G[실행 파일]
H[GDB/LLDB]
end
C -->|컴파일러 경로, 헤더 경로| B
B -->|자동 완성, 에러 표시| A
D -->|빌드 명령 정의| F
F -->|컴파일| G
E -->|디버그 설정| H
H -->|디버깅| G
1단계: VS Code와 C/C++ 확장 설치
VS Code는 Microsoft가 개발한 무료 오픈소스 코드 편집기다. 가볍지만 강력한 확장 기능을 통해 본격적인 IDE로 변신할 수 있습니다.
VS Code 다운로드 및 설치
VS Code 공식 사이트에서 운영체제에 맞는 설치 프로그램을 다운로드합니다. 설치 과정은 매우 간단합니다. 기본 설정으로 진행하면 됩니다.
권장 설정:
- “PATH에 추가” 옵션을 체크하면 터미널에서
code명령으로 프로젝트를 열 수 있습니다. - “파일 연결” 옵션을 체크하면
.cpp파일을 더블클릭했을 때 VS Code로 열립니다.
C++ 확장 설치
VS Code 자체는 C++을 직접 지원하지 않습니다. C++ 개발을 위해서는 Microsoft의 C++ 확장을 설치해야 합니다.
설치 방법:
- VS Code를 실행합니다.
- 왼쪽 사이드바의 Extensions 아이콘을 클릭하거나
Ctrl+Shift+X(macOS:Cmd+Shift+X)를 누릅니다. - 검색창에 “C/C++“를 입력합니다.
- Microsoft가 제공하는 “C/C++” 확장을 찾아서 Install 버튼을 클릭합니다. 이 확장은 IntelliSense(자동 완성), 코드 네비게이션, GDB(GNU 디버거—Linux 등에서 사용하는 콘솔 디버거)·LLDB(LLVM 디버거—macOS 기본, Clang 계열)를 이용한 디버깅 기능을 제공합니다.
왜 컴파일러 경로가 중요할까?
VS Code C++ 확장은 실제로 설치된 컴파일러를 참조해서 헤더 경로와 표준 버전을 파악합니다. compilerPath가 잘못되거나 비어 있으면 시스템 헤더(<vector>, <iostream> 등)를 찾지 못해 “빨간 밑줄이 잔뜩 나오는데 빌드는 된다”는 상황이 생깁니다. .vscode/c_cpp_properties.json에서 compilerPath를 터미널에서 사용하는 g++ 또는 clang++ 경로와 동일하게 맞춰 주면 해결됩니다.
2단계: c_cpp_properties.json으로 IntelliSense 맞추기
c_cpp_properties.json이란?
프로젝트 폴더에 .vscode/c_cpp_properties.json을 만들면, C++ 확장이 어느 컴파일러를 쓰고 어느 경로의 헤더를 참조할지 알 수 있어 자동 완성과 오류 표시가 정확해집니다.
정의를 풀어 쓰면 IntelliSense는 “코드를 입력할 때 자동 완성·함수 시그니처·에러 표시를 해 주는 기능”입니다. compilerPath는 실제로 사용하는 g++/clang++ 경로와 맞추는 것이 좋으며, cppStandard는 프로젝트에서 쓰는 C++ 표준(예: C++17, C++20)으로 맞춥니다. includePath의 ${workspaceFolder}/*는 “현재 워크스페이스 아래 모든 경로를 헤더 검색 경로에 포함”한다는 뜻이라, 프로젝트 내 자작 헤더를 쓸 때 편합니다. 처음에는 컴파일러 경로만 맞춰도 빨간 밑줄이 많이 사라지는 걸 확인할 수 있습니다.
c_cpp_properties.json 생성
프로젝트 루트에 .vscode 폴더를 만들고, 그 안에 c_cpp_properties.json을 생성합니다.
Linux 기본 예시:
{
"configurations": [
{
"name": "Linux",
"includePath": [
"${workspaceFolder}/**"
],
"defines": [],
"compilerPath": "/usr/bin/g++",
"cStandard": "c17",
"cppStandard": "c++17",
"intelliSenseMode": "linux-gcc-x64"
}
],
"version": 4
}
c_cpp_properties.json 필드 상세 설명:
- “name”: “Linux”: 이 구성의 이름입니다. 여러 OS별 구성을 만들 수 있습니다.
- 예:
"Linux","Windows","Mac" - VS Code는 현재 OS에 맞는 구성을 자동으로 선택합니다.
- 예:
- “includePath”: 헤더 파일을 검색할 경로 목록입니다.
- ”${workspaceFolder}/”: 작업 공간의 모든 하위 디렉토리를 포함합니다.
**는 재귀적으로 모든 하위 디렉토리를 의미합니다.
- 프로젝트 내 헤더:
#include "myheader.h"인식 - 추가 경로 예시:
"/usr/local/include","${workspaceFolder}/external/boost"
- ”${workspaceFolder}/”: 작업 공간의 모든 하위 디렉토리를 포함합니다.
- “defines”: []: 전처리기 매크로 정의 목록입니다.
- 예:
["DEBUG=1", "VERSION=2"] #ifdef DEBUG같은 조건부 컴파일을 IntelliSense가 인식하게 합니다.
- 예:
- “compilerPath”: “/usr/bin/g++”: 사용할 컴파일러의 전체 경로입니다.
- 매우 중요! 이 경로가 틀리면 시스템 헤더를 찾지 못합니다.
- 확인 방법: 터미널에서
which g++또는which clang++ - Windows MinGW:
"C:/msys64/mingw64/bin/g++.exe" - macOS:
"/usr/bin/clang++"
- “cppStandard”: “c++17”: 사용할 C++ 표준 버전입니다.
- 옵션:
"c++11","c++14","c++17","c++20","c++23" - 프로젝트에서 사용하는 표준과 일치시켜야 합니다.
- 예: C++20 기능(
std::format)을 쓰는데c++17로 설정하면 에러 표시됩니다.
- 옵션:
- “intelliSenseMode”: “linux-gcc-x64”: IntelliSense 엔진 모드입니다.
- 형식:
{os}-{compiler}-{architecture} - Linux GCC:
"linux-gcc-x64" - Windows GCC:
"windows-gcc-x64" - macOS Clang: Apple Silicon은
"macos-clang-arm64", Intel 맥은"macos-clang-x64" - Windows MSVC:
"windows-msvc-x64" - 컴파일러 타입과 맞지 않으면 IntelliSense가 오작동할 수 있습니다. 대부분의 경우 이 값은 생략해도
compilerPath를 보고 자동으로 정해지므로, 틀린 값을 적어 두는 것보다 비워 두는 편이 낫습니다.
- 형식:
compile_commands.json을 쓰는 것이 가장 정확하다
includePath와 defines를 손으로 맞추는 방식은 파일 몇 개짜리 실습에서는 충분하지만, 실제 프로젝트에서는 빌드 옵션과 금방 어긋납니다. 빌드 시스템이 모든 소스 파일의 실제 컴파일 명령을 기록한 compile_commands.json을 만들게 하고, 편집기가 그걸 읽게 하면 IntelliSense가 빌드와 정확히 같은 옵션을 씁니다.
cmake -S . -B build -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
// .vscode/c_cpp_properties.json
{
"configurations": [
{
"name": "CMake",
"compileCommands": "${workspaceFolder}/build/compile_commands.json"
}
],
"version": 4
}
CMake Tools 확장을 쓴다면 "configurationProvider": "ms-vscode.cmake-tools"로 두면 선택한 프리셋의 설정을 자동으로 넘겨줍니다. Makefile 프로젝트라면 bear -- make로 같은 파일을 만들 수 있습니다. 제 경우 빨간 밑줄 문제는 거의 전부 “빌드는 A 옵션으로 하는데 IntelliSense는 B 옵션으로 해석”하는 불일치였고, compile_commands.json으로 바꾼 뒤로는 이 종류의 문제가 사실상 사라졌습니다.
OS별 compilerPath와 intelliSenseMode
Windows (MinGW):
"compilerPath": "C:/msys64/mingw64/bin/g++.exe",
"intelliSenseMode": "windows-gcc-x64"
macOS (Apple Silicon):
"compilerPath": "/usr/bin/clang++",
"intelliSenseMode": "macos-clang-arm64"
Windows (MSVC):
"compilerPath": "C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/MSVC/<버전>/bin/Hostx64/x64/cl.exe",
"intelliSenseMode": "windows-msvc-x64"
MSVC는 cl.exe 경로만 맞춘다고 끝나지 않습니다. cl.exe가 표준 헤더와 라이브러리를 찾으려면 INCLUDE, LIB 같은 환경 변수가 필요하고, 이 값은 Visual Studio의 개발자 명령 프롬프트(vcvars)가 설정합니다. 그래서 tasks.json에서 cl로 빌드하려면 “Developer PowerShell for VS”를 연 뒤 그 창에서 code .로 VS Code를 실행해야 합니다. 시작 메뉴에서 VS Code를 그냥 실행하면 'cl' is not recognized 또는 Cannot open include file: 'iostream' 에러가 납니다. CMake Tools 확장을 쓴다면 “Visual Studio Community 2022 Release - amd64” 같은 kit을 고르면 이 환경을 대신 잡아 줍니다.
여러 OS를 동시에 지원하는 구성 예시:
{
"configurations": [
{
"name": "Linux",
"includePath": ["${workspaceFolder}/**"],
"defines": [],
"compilerPath": "/usr/bin/g++",
"cStandard": "c17",
"cppStandard": "c++17",
"intelliSenseMode": "linux-gcc-x64"
},
{
"name": "Mac",
"includePath": ["${workspaceFolder}/**"],
"defines": [],
"compilerPath": "/usr/bin/clang++",
"cStandard": "c17",
"cppStandard": "c++17",
"intelliSenseMode": "macos-clang-arm64"
},
{
"name": "Win32",
"includePath": ["${workspaceFolder}/**"],
"defines": [],
"compilerPath": "C:/msys64/ucrt64/bin/g++.exe",
"cStandard": "c17",
"cppStandard": "c++17",
"intelliSenseMode": "windows-gcc-x64"
}
],
"version": 4
}
3단계: tasks.json으로 빌드 작업 만들기
tasks.json이란?
tasks.json은 “빌드” 버튼이나 Ctrl+Shift+B를 눌렀을 때 실행할 셸 명령을 정의합니다. 아래 설정에서는 command가 g++이고, args에 -g(디버그 정보 포함), ${file}(현재 열린 파일), -o 다음에 출력 실행 파일 경로가 옵니다. ${fileDirname}/${fileBasenameNoExtension}은 “현재 파일과 같은 폴더에, 확장자 없이 같은 이름”으로 실행 파일을 만든다는 뜻이라, main.cpp를 열고 빌드하면 main 실행 파일이 같은 폴더에 생깁니다. group.isDefault: true로 두면 “기본 빌드 작업”이 되어 단축키로 바로 실행됩니다.
tasks.json 생성
.vscode/tasks.json 생성:
{
"version": "2.0.0",
"tasks": [
{
"label": "C++ Build",
"type": "shell",
"command": "g++",
"args": [
"-g",
"-std=c++17",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}"
],
"group": {
"kind": "build",
"isDefault": true
}
}
]
}
tasks.json 필드 상세 설명:
- “version”: “2.0.0”: tasks.json 파일 형식 버전입니다. 2.0.0이 현재 표준입니다.
- “label”: “C++ Build”: 이 작업의 이름입니다. 나중에
launch.json에서 이 이름으로 참조합니다. - “type”: “shell”: 셸 명령을 실행하는 작업입니다.
- 다른 옵션:
"process"(셸 없이 직접 실행)
- 다른 옵션:
- “command”: “g++”: 실행할 명령어입니다. 경로가 환경변수에 있어야 합니다.
- “args”: 명령어에 전달할 인자 배열입니다.
- “-g”: 디버그 정보를 포함합니다. 이것이 없으면 디버거에서 소스 코드를 볼 수 없습니다.
- “-std=c++17”: C++17 표준을 사용합니다. 프로젝트에 맞게 변경하세요.
- ”${file}”: 현재 편집 중인 파일의 전체 경로입니다.
- 예:
/home/user/project/main.cpp
- 예:
- “-o”: 출력 파일을 지정하는 옵션입니다.
- ”${fileDirname}/${fileBasenameNoExtension}”: 출력 파일 경로입니다.
${fileDirname}: 현재 파일의 디렉토리 (예:/home/user/project)${fileBasenameNoExtension}: 확장자 없는 파일 이름 (예:main)- 결과:
/home/user/project/main
- “group”: 작업 그룹 설정입니다.
- “kind”: “build”: 빌드 작업임을 표시합니다.
- “isDefault”: true: 이 작업을 기본 빌드 작업으로 설정합니다.
Ctrl+Shift+B를 누르면 이 작업이 실행됩니다.
VS Code 변수 목록
| 변수 | 설명 |
|---|---|
${workspaceFolder} | 작업 공간 루트 디렉토리 |
${file} | 현재 파일 전체 경로 |
${fileBasename} | 현재 파일 이름 (예: main.cpp) |
${fileBasenameNoExtension} | 확장자 없는 파일 이름 (예: main) |
${fileDirname} | 현재 파일의 디렉토리 |
빌드 실행
- 단축키:
Ctrl+Shift+B(macOS:Cmd+Shift+B) - 또는
Terminal→Run Build Task참고:tasks.json의"${file}"은 현재 열린 파일 하나만 컴파일합니다. 여러 소스 파일(main.cpp + utils.cpp 등)을 함께 빌드하려면 아래 “멀티파일 빌드”처럼args에 파일 목록을 나열하거나, CMake를 쓰는 편이 관리하기 쉽습니다.
4단계: launch.json으로 디버거 연결하기
launch.json이란?
launch.json은 디버거가 어떤 실행 파일을 어떻게 실행할지 정의합니다. preLaunchTask로 빌드 작업을 연결하면, 디버깅 시작 전에 자동으로 빌드가 실행됩니다.
launch.json 생성
.vscode/launch.json 생성:
{
"version": "0.2.0",
"configurations": [
{
"name": "C++ Debug",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}/${fileBasenameNoExtension}",
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "C++ Build",
"miDebuggerPath": "/usr/bin/gdb"
}
]
}
launch.json 필드 상세 설명:
- “name”: “C++ Debug”: 디버그 구성의 이름입니다. 디버그 패널에서 이 이름으로 표시됩니다.
- “type”: “cppdbg”: C/C++ 디버깅 타입입니다. C/C++ 확장이 이 타입을 처리합니다.
- “request”: “launch”: 새로 프로그램을 실행합니다.
- 다른 옵션:
"attach"(이미 실행 중인 프로세스에 붙음)
- 다른 옵션:
- “program”: ”${fileDirname}/${fileBasenameNoExtension}”: 디버깅할 실행 파일 경로입니다.
tasks.json에서 생성한 실행 파일과 같은 경로여야 합니다.- 예:
main.cpp를 열면./main실행 파일을 디버깅합니다.
- “args”: []: 프로그램에 전달할 명령줄 인자입니다.
- 예:
["input.txt", "output.txt"]
- 예:
- “stopAtEntry”: false:
main함수 첫 줄에서 자동으로 멈출지 여부입니다.true: 시작하자마자 멈춤 (단계별 실행 가능)false: 브레이크포인트까지 실행
- “cwd”: ”${fileDirname}”: 프로그램이 실행될 작업 디렉토리입니다.
- 파일 읽기/쓰기 시 상대 경로의 기준이 됩니다.
- “externalConsole”: false: VS Code 내장 터미널을 사용합니다.
true: 외부 터미널 창을 엽니다.
- “MIMode”: “gdb”: 사용할 디버거 종류입니다.
- Linux/Windows(MinGW):
"gdb" - macOS:
"lldb"
- Linux/Windows(MinGW):
- “preLaunchTask”: “C++ Build”: 디버깅 전에 실행할 작업입니다.
tasks.json의"label"과 일치해야 합니다.- 디버깅 전에 자동으로 빌드합니다.
- “miDebuggerPath”: “/usr/bin/gdb”: GDB 실행 파일 경로입니다.
which gdb명령으로 확인할 수 있습니다.- Windows:
"C:/msys64/mingw64/bin/gdb.exe" - macOS: 지정하지 않음.
/usr/bin/lldb는 MI 프로토콜을 말하지 않는 일반 lldb라 여기에 넣으면 디버거가 시작되지 않습니다. C/C++ 확장은 macOS용lldb-mi를 자체적으로 포함하고 있으므로MIMode만lldb로 바꾸면 됩니다.
OS별 디버거 설정
Windows (MinGW):
"MIMode": "gdb",
"miDebuggerPath": "C:/msys64/mingw64/bin/gdb.exe"
macOS:
"MIMode": "lldb"
macOS에서는 miDebuggerPath를 생략합니다. 다만 cppdbg의 LLDB 연동은 MI 계층을 한 번 거치기 때문에, STL 컨테이너 값이 제대로 안 보이거나 단계 실행이 느린 경우가 있습니다. 그럴 때는 CodeLLDB 확장("type": "lldb")이나 LLVM이 배포하는 LLDB DAP 확장("type": "lldb-dap")으로 바꾸는 것을 권합니다. 둘 다 LLDB를 직접 쓰기 때문에 macOS에서 체감 차이가 큽니다.
{
"name": "Debug (CodeLLDB)",
"type": "lldb",
"request": "launch",
"program": "${fileDirname}/${fileBasenameNoExtension}",
"cwd": "${fileDirname}",
"preLaunchTask": "C++ Build"
}
Windows (MSVC): MSVC로 빌드한 실행 파일은 GDB가 아니라 Visual Studio 디버거 엔진을 쓰는 "type": "cppvsdbg"로 디버깅합니다. program에는 .exe까지 붙인 경로를 적습니다.
{
"name": "Debug (MSVC)",
"type": "cppvsdbg",
"request": "launch",
"program": "${fileDirname}/${fileBasenameNoExtension}.exe",
"cwd": "${fileDirname}",
"console": "integratedTerminal",
"preLaunchTask": "C++ Build"
}
디버깅 실행
- 브레이크포인트 설정 (줄 번호 왼쪽 클릭)
F5또는Run→Start Debugging
디버깅 단축키
| 단축키 | 동작 |
|---|---|
F5 | 디버깅 시작/계속 |
F10 | Step Over (다음 줄) |
F11 | Step Into (함수 안으로) |
Shift+F11 | Step Out (함수 밖으로) |
Shift+F5 | 디버깅 중지 |
빨간 밑줄·헤더 못 찾음·preLaunchTask 오류 해결
”빌드는 되는데 빨간 밑줄이 나와요”
증상: <iostream>, <vector> 등 표준 라이브러리에 빨간 밑줄. 터미널에서는 g++ 빌드가 정상 동작.
원인: c_cpp_properties.json의 compilerPath가 비어 있거나 잘못됩니다.
해결법:
# 터미널에서 컴파일러 경로 확인
which g++
# 또는
which clang++
확인한 경로를 c_cpp_properties.json의 compilerPath에 정확히 입력합니다.
"compilerPath": "/usr/bin/g++"
추가 확인: intelliSenseMode가 사용 중인 컴파일러와 맞는지 확인 (GCC → linux-gcc-x64, Clang → macos-clang-x64).
”Cannot find source file” 또는 헤더를 찾을 수 없음
증상: #include "myheader.h"에 빨간 밑줄. “file not found” 오류.
원인: includePath에 해당 헤더 경로가 없음.
해결법:
"includePath": [
"${workspaceFolder}/**",
"${workspaceFolder}/external/boost",
"/usr/local/include"
]
외부 라이브러리를 쓰는 경우, 해당 include 경로를 includePath에 추가합니다.
”preLaunchTask ‘C++ Build’ not found”
증상: F5로 디버깅 시 “Could not find the task ‘C++ Build’” 오류.
원인: launch.json의 preLaunchTask 값이 tasks.json의 label과 일치하지 않음.
해결법:
tasks.json의 label과 launch.json의 preLaunchTask를 동일하게 맞춥니다.
// tasks.json
"label": "C++ Build"
// launch.json
"preLaunchTask": "C++ Build"
macOS에서 “Unable to find debugger” 또는 LLDB 오류
증상: macOS에서 F5 시 디버거를 찾을 수 없다는 오류. 원인: Xcode Command Line Tools 미설치 또는 LLDB 경로 문제. 해결법:
# Xcode Command Line Tools 설치
xcode-select --install
launch.json에서 MIMode를 "lldb"로 설정하며, miDebuggerPath는 생략하거나 /usr/bin/lldb로 지정합니다.
Windows에서 “g++ not found” 또는 “gdb not found”
증상: 빌드/디버깅 시 g++ 또는 gdb를 찾을 수 없음.
원인: MinGW/MSYS2가 PATH에 추가되지 않음.
해결법:
- MSYS2 설치 후 UCRT64 환경에서
pacman -S mingw-w64-ucrt-x86_64-gcc mingw-w64-ucrt-x86_64-gdb로 설치 (MSYS2는 최신 Windows용으로 UCRT64 환경을 권장하며, 예전 글의mingw64환경도 동작하지만 둘을 섞으면 안 됩니다) - 시스템 환경 변수 PATH에
C:\msys64\ucrt64\bin추가 후 VS Code를 완전히 재시작 (열려 있던 VS Code는 예전 PATH를 계속 씀) tasks.json과launch.json에서 전체 경로 사용:
"command": "C:/msys64/ucrt64/bin/g++.exe",
"miDebuggerPath": "C:/msys64/ucrt64/bin/gdb.exe"
빌드한 .exe를 탐색기에서 더블클릭하면 libstdc++-6.dll을 찾을 수 없습니다가 나오는 경우가 있습니다. MinGW 런타임 DLL이 PATH에 없어서인데, VS Code 터미널에서는 PATH가 잡혀 있어서 문제가 안 보입니다. 배포용이라면 -static 또는 -static-libstdc++ -static-libgcc로 링크하세요.
C++20 기능에 빨간 밑줄 (std::format 등)
증상: std::format, std::ranges 등 C++20 기능에 “not found” 또는 에러 표시.
원인: cppStandard가 c++17 이하로 설정되어 있거나, 컴파일러 자체가 해당 기능을 아직 지원하지 않습니다. 예를 들어 std::format은 GCC 13, Clang 17(libc++) 이상에서 사용할 수 있으므로, 오래된 배포판 기본 컴파일러에서는 표준을 c++20으로 바꿔도 헤더가 없습니다.
해결법:
c_cpp_properties.json과 tasks.json 모두 C++20으로 맞춥니다.
// c_cpp_properties.json
"cppStandard": "c++20"
// tasks.json args에 추가
"-std=c++20"
”undefined reference to” 링크 에러
증상: 컴파일은 되는데 링크 시 undefined reference to '함수명' 오류.
원인: 헤더만 include하고 구현 파일(.cpp)을 빌드에 포함하지 않음. 또는 라이브러리(-l 옵션) 미지정.
해결법:
// tasks.json - 현재 폴더의 모든 .cpp를 함께 빌드 ("type": "shell"이어야 *가 확장됨)
"args": [
"-g", "-std=c++17",
"${fileDirname}/*.cpp",
"-o", "${fileDirname}/app"
]
외부 라이브러리 사용 시:
"args": [
"-g", "-std=c++17", "${file}",
"-o", "${fileDirname}/${fileBasenameNoExtension}",
"-lpthread", "-lm"
]
IntelliSense가 느리거나 멈춤
증상: 코드 입력 시 자동 완성이 늦게 뜨거나, 에디터가 잠시 멈춤.
원인: 대형 프로젝트에서 includePath에 **로 전체 폴더를 스캔하거나, 외부 라이브러리 경로가 과도함.
해결법:
includePath를 필요한 경로만 지정 (예:"${workspaceFolder}/src","${workspaceFolder}/include")- CMake 사용 시
compile_commands.json활용 (C++ 확장이 자동 인식) "C_Cpp.files.exclude"와"files.watcherExclude"에build/,third_party/처럼 분석할 필요 없는 폴더를 넣기- 그래도 느리면 clangd로 전환 검토 (아래 clangd 절)
디버깅 시 변수 값이 “optimized out”으로 표시
증상: 브레이크포인트에서 변수 값을 볼 때 “optimized out” 또는 <optimized out> 표시.
원인: -O2, -O3 등 최적화 옵션으로 빌드했기 때문. 최적화 시 변수가 레지스터에만 있거나 제거됩니다.
해결법:
디버그 빌드 시 -O0 -g 사용:
"args": ["-O0", "-g", "-std=c++17", "${file}", "-o", "..."],
Windows에서 한글 경로 문제
증상: 파일 경로에 한글이 있으면 빌드·실행 시 오류.
원인: MinGW의 GCC·GDB와 일부 도구가 Windows의 시스템 코드 페이지(한국어 Windows는 CP949)로 경로를 해석하면서, UTF-8로 전달된 한글 경로를 다른 문자로 읽습니다. 사용자 이름이 한글이라 C:\Users\홍길동\ 아래에서 작업할 때 특히 흔합니다.
해결법:
- 가장 확실한 방법은 프로젝트를 영문 경로(예:
C:\dev\project)에 두는 것입니다. - 소스 코드 안의 한글 문자열이 깨지는 것은 별개 문제입니다. MSVC는
/utf-8옵션, 콘솔 출력은chcp 65001또는 Windows Terminal 사용으로 해결합니다. 인코딩 문제 전반은 문자 인코딩 글에 정리했습니다.
main·utils로 나눈 멀티파일 프로젝트 빌드
프로젝트 구조
myproject/
├── .vscode/
│ ├── c_cpp_properties.json # IntelliSense 설정
│ ├── tasks.json # 빌드 태스크
│ └── launch.json # 디버그 설정
├── main.cpp
├── utils.h
└── utils.cpp
main.cpp
#include <iostream>
#include "utils.h"
int main() {
int result = add(5, 3);
std::cout << "5 + 3 = " << result << std::endl;
return 0;
}
utils.h
#pragma once
int add(int a, int b);
utils.cpp
#include "utils.h"
int add(int a, int b) {
return a + b;
}
멀티파일 빌드
tasks.json에 추가 태스크:
{
"label": "C++ Build Multi-File",
"type": "shell",
"command": "g++",
"args": [
"-g",
"-std=c++17",
"main.cpp",
"utils.cpp",
"-o",
"myapp"
],
"group": {
"kind": "build",
"isDefault": false
},
"options": {
"cwd": "${workspaceFolder}"
}
}
주의: 멀티파일 빌드 시 "${file}" 대신 main.cpp, utils.cpp처럼 파일 목록을 명시합니다. cwd를 ${workspaceFolder}로 두어 프로젝트 루트에서 빌드되도록 합니다.
launch.json에서 멀티파일 빌드를 사용하려면:
"program": "${workspaceFolder}/myapp",
"preLaunchTask": "C++ Build Multi-File"
CMake 프로젝트와 연동
프로젝트가 커지면 CMake를 사용하는 편이 좋습니다. CMake 확장을 설치하면 CMakeLists.txt 기반으로 자동으로 tasks.json과 launch.json을 생성할 수 있습니다.
# CMake 확장 설치 후
# Ctrl+Shift+P → "CMake: Configure" 실행
# 빌드: Ctrl+Shift+B
# 디버깅: F5
환경 확인 스크립트
새 PC나 팀원 환경에서 설정이 제대로 되었는지 확인할 때 아래 스크립트를 실행해 보세요.
Linux/macOS:
#!/bin/bash
echo "=== C++ 개발 환경 확인 ==="
echo "g++: $(which g++ 2>/dev/null || echo '미설치')"
echo "clang++: $(which clang++ 2>/dev/null || echo '미설치')"
echo "gdb: $(which gdb 2>/dev/null || echo '미설치')"
echo "lldb: $(which lldb 2>/dev/null || echo '미설치')"
echo ""
echo "g++ 버전:"
g++ --version 2>/dev/null | head -1 || echo "g++ 없음"
echo ""
echo "clang++ 버전:"
clang++ --version 2>/dev/null | head -1 || echo "clang++ 없음"
Windows (PowerShell):
Write-Host "=== C++ 개발 환경 확인 ==="
Write-Host "g++: $(Get-Command g++ -ErrorAction SilentlyContinue | Select-Object -ExpandProperty Source)"
Write-Host "gdb: $(Get-Command gdb -ErrorAction SilentlyContinue | Select-Object -ExpandProperty Source)"
g++ --version 2>$null
clangd로 바꾸기, 그리고 VS Code 기반 다른 편집기
clangd
clangd는 LLVM이 만드는 C++ 언어 서버입니다. compile_commands.json을 읽어 파일마다 정확한 옵션으로 분석하고, 인덱싱이 빠르며 clang-tidy 경고를 편집기에서 바로 보여 줍니다. VS Code에서는 “clangd” 확장(llvm-vs-code-extensions.vscode-clangd)을 설치하면 되는데, Microsoft C/C++ 확장의 IntelliSense와 동시에 켜면 자동 완성과 오류 표시가 두 번씩 나옵니다. clangd 확장이 처음 실행될 때 이걸 끌지 물어보며, 직접 설정한다면 이렇게 둡니다.
// .vscode/settings.json
{
"C_Cpp.intelliSenseEngine": "disabled",
"clangd.arguments": [
"--compile-commands-dir=${workspaceFolder}/build",
"--background-index",
"--clang-tidy",
"--header-insertion=never"
]
}
Microsoft 확장은 디버거(cppdbg, cppvsdbg) 용도로 남겨 둘 수 있습니다. clangd가 표준 헤더를 못 찾는다면, GCC로 빌드하는 프로젝트에서 clangd가 GCC의 헤더 위치를 모르는 경우입니다. --query-driver=/usr/bin/g++*를 추가하면 clangd가 해당 컴파일러에게 헤더 경로를 물어봅니다.
Cursor, VSCodium 등에서 C/C++ 확장이 안 될 때
Microsoft의 C/C++ 확장은 라이선스상 Microsoft의 VS Code 제품에서만 쓰도록 되어 있고, 2025년부터는 확장이 실행 환경을 확인해 Cursor, VSCodium 같은 다른 VS Code 기반 편집기에서 동작을 막기 시작했습니다. 이런 편집기에서 “이 확장은 Microsoft 제품에서만 사용할 수 있습니다” 같은 메시지와 함께 IntelliSense와 디버깅이 멈췄다면 이것이 원인입니다. 대안은 위의 clangd(코드 분석)와 CodeLLDB 또는 LLDB DAP(디버깅) 조합이고, Windows의 MSVC 디버깅(cppvsdbg)처럼 대체가 어려운 부분은 VS Code 본체나 Visual Studio를 병행하는 수밖에 없습니다.
VS Code C++ 관련 추천 확장
| 확장 | 용도 |
|---|---|
| C/C++ (Microsoft) | 필수. IntelliSense, 디버깅 |
| CMake Tools | CMake 프로젝트 빌드·디버깅 |
| clangd | 대안 IntelliSense (선택, c_cpp_properties 대신 compile_commands.json 사용) |
| CodeLLDB / LLDB DAP | macOS/Linux에서 LLDB 직접 디버깅 (Microsoft 확장 없이도 동작) |
| Better C++ Syntax | C++ 문법 하이라이팅 개선 |
참고: clangd와 Microsoft C++ 확장을 동시에 쓰면 충돌할 수 있습니다. 하나만 사용하세요.
프로젝트별 확장 추천 (.vscode/extensions.json)
팀원이 프로젝트를 열었을 때 필요한 확장을 자동으로 추천받도록 .vscode/extensions.json을 만들 수 있습니다.
{
"recommendations": [
"ms-vscode.cpptools",
"ms-vscode.cmake-tools"
],
"unwantedRecommendations": []
}
완전한 VS Code 설정 예시 (단일 파일)
아래는 .cpp 파일 하나를 빌드·디버깅하는 최소 완전한 설정입니다. 프로젝트 루트에 .vscode 폴더를 만들고, 아래 세 파일을 그대로 복사해 사용할 수 있습니다.
c_cpp_properties.json (Linux 기준):
{
"configurations": [
{
"name": "Linux",
"includePath": [
"${workspaceFolder}/**",
"/usr/local/include"
],
"defines": [],
"compilerPath": "/usr/bin/g++",
"cStandard": "c17",
"cppStandard": "c++17",
"intelliSenseMode": "linux-gcc-x64"
}
],
"version": 4
}
tasks.json (단일 파일 + 멀티파일 빌드):
{
"version": "2.0.0",
"tasks": [
{
"label": "C++ Build",
"type": "shell",
"command": "g++",
"args": [
"-g",
"-std=c++17",
"-Wall",
"-Wextra",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}"
],
"group": { "kind": "build", "isDefault": true },
"presentation": { "reveal": "silent", "echo": true }
},
{
"label": "C++ Build Release",
"type": "shell",
"command": "g++",
"args": [
"-O3",
"-std=c++17",
"-Wall",
"-DNDEBUG",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}"
],
"group": "build"
}
]
}
launch.json (Linux + macOS):
{
"version": "0.2.0",
"configurations": [
{
"name": "C++ Debug",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}/${fileBasenameNoExtension}",
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerPath": "/usr/bin/gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "C++ Build"
},
{
"name": "C++ Debug (macOS)",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}/${fileBasenameNoExtension}",
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"MIMode": "lldb",
"preLaunchTask": "C++ Build"
}
]
}
Windows (MinGW) 예시:
{
"configurations": [
{
"name": "C++ Debug (Windows)",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}/${fileBasenameNoExtension}.exe",
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"MIMode": "gdb",
"miDebuggerPath": "C:/msys64/mingw64/bin/gdb.exe",
"preLaunchTask": "C++ Build"
}
]
}
tasks.json Windows용 (command 경로 지정):
{
"tasks": [
{
"label": "C++ Build",
"type": "shell",
"command": "C:/msys64/mingw64/bin/g++.exe",
"args": ["-g", "-std=c++17", "${file}", "-o", "${fileDirname}/${fileBasenameNoExtension}.exe"],
"group": { "kind": "build", "isDefault": true }
}
]
}
Debug/Release 태스크·silent 출력·defines 설정
1. 여러 빌드 구성 (Debug/Release)
tasks.json에 Debug·Release 태스크를 나누고, -O0 -g(디버그)와 -O3(릴리스)를 구분해 사용할 수 있습니다.
2. 터미널에서 빌드 출력 숨기기
"presentation": { "reveal": "silent" }를 tasks.json 태스크에 추가하면 빌드 시 터미널 패널이 자동으로 열리지 않습니다.
3. 조건부 컴파일
c_cpp_properties.json의 defines에 [DEBUG=1]를 넣으면 #ifdef DEBUG 블록이 IntelliSense에 반영됩니다.
4. 워크스페이스별 설정
.vscode 폴더는 프로젝트 루트에 두면, 해당 폴더를 열었을 때만 설정이 적용됩니다. 팀원과 .vscode를 Git에 커밋해 공유할 수 있습니다.
단축키·멀티커서·조건부 브레이크포인트
필수 단축키
| 단축키 | 동작 |
|---|---|
Ctrl+Shift+B / Cmd+Shift+B | 빌드 실행 |
F5 | 디버깅 시작 |
Ctrl+Shift+P / Cmd+Shift+P | 명령 팔레트 |
Ctrl+P / Cmd+P | 파일 빠른 열기 |
Ctrl+Shift+O / Cmd+Shift+O | 현재 파일 심볼(함수) 이동 |
F12 | 정의로 이동 |
F2 | 심볼 이름 변경 (리팩터링) |
Ctrl+Space / Cmd+Space | IntelliSense 자동 완성 강제 |
IntelliSense 재시작
compilerPath나 includePath를 수정했는데도 빨간 밑줄이 사라지지 않을 때:
Ctrl+Shift+P/Cmd+Shift+P→ “C++: Reset IntelliSense Database” 실행- 또는 “Developer: Reload Window”로 VS Code 재시작
멀티커서로 빠른 편집
Ctrl+D/Cmd+D: 같은 단어를 순차적으로 선택Alt+클릭/Option+클릭: 여러 위치에 커서 추가Ctrl+Shift+L/Cmd+Shift+L: 선택한 단어 전체 선택
파일/심볼 검색
Ctrl+P후@입력: 현재 파일 내 심볼(함수, 클래스) 검색Ctrl+P후#입력: 워크스페이스 전체 심볼 검색Ctrl+Shift+F/Cmd+Shift+F: 전체 워크스페이스 텍스트 검색
조건부 브레이크포인트
브레이크포인트를 우클릭 → “Edit Breakpoint” → 조건 입력 (예: i == 5).
반복문에서 특정 반복 시에만 멈출 때 유용합니다.
.vscode 공유와 팀 온보딩
.vscode 폴더 Git 관리
권장: .vscode 폴더를 Git에 커밋하여 팀 전체가 동일한 설정을 사용합니다.
# .gitignore에 넣지 말 것 (권장)
# .vscode/
# 개인 설정만 제외할 경우
# .vscode/settings.json # 개인 선호도
개인 설정 분리: settings.json에 팀 공통 설정과 개인 설정이 섞일 수 있습니다. 팀 공통은 .vscode/settings.json에 두며, 사용자별 설정은 VS Code 사용자 설정(~/.config/Code/User/settings.json)에 둡니다.
팀 온보딩 체크리스트
새 팀원이 VS Code 설정을 완료했는지 확인하는 체크리스트:
# C++ 개발 환경 설정 체크리스트
- [ ] VS Code + C/C++ 확장 설치
- [ ] g++ 또는 clang++ 설치 (which g++ 확인)
- [ ] gdb 또는 lldb 설치 (디버깅용)
- [ ] .vscode 폴더가 프로젝트에 있음
- [ ] Ctrl+Shift+B로 빌드 성공
- [ ] F5로 디버깅 시작 가능
- [ ] IntelliSense 빨간 밑줄 없음
CI/CD 빌드와 연동
VS Code tasks.json의 빌드 명령과 CI/CD 파이프라인을 동일하게 유지하면 “로컬에서는 되는데 CI에서 안 된다”는 문제를 줄일 수 있습니다.
예: GitHub Actions:
# .github/workflows/build.yml
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Build
run: |
g++ -std=c++17 -Wall -Wextra -O2 src/main.cpp src/utils.cpp -o myapp
tasks.json의 args와 위 run 명령을 동일하게 맞추면 됩니다.
대형 프로젝트: CMake + compile_commands.json
소스 파일이 많아지면 tasks.json에서 파일을 수동으로 나열하기 어렵습니다. 이때 CMake를 사용하고:
# CMakeLists.txt
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
CMake 확장이 compile_commands.json을 생성하면, C++ 확장이 이를 자동으로 읽어 IntelliSense를 설정합니다. c_cpp_properties.json을 수동으로 관리할 필요가 없어집니다.
문제 해결 흐름도
flowchart TD
A[빨간 밑줄 / 빌드 오류] --> B{터미널에서 빌드 가능?}
B -->|예| C[compilerPath 확인]
B -->|아니오| D[g++/clang++ 설치 확인]
C --> E[which g++ 결과를 compilerPath에 입력]
E --> F[IntelliSense 재시작: Ctrl+Shift+P → C++: Reset IntelliSense]
D --> G[패키지 매니저로 설치]
G --> H[PATH 환경변수 확인]
설정 점검표
VS Code C++ 환경 구축 시 아래 항목을 확인하세요.
설치 및 확장
- VS Code 설치 완료
- C/C++ 확장 (Microsoft) 설치
- 터미널에서
g++또는clang++실행 가능 - 터미널에서
gdb또는lldb실행 가능 (디버깅용)
IntelliSense (c_cpp_properties.json)
-
.vscode/c_cpp_properties.json생성 -
compilerPath가which g++/which clang++결과와 일치 -
intelliSenseMode가 OS·컴파일러에 맞음 -
cppStandard가 프로젝트 C++ 버전과 일치 -
includePath에 프로젝트 및 외부 라이브러리 경로 포함
빌드 (tasks.json)
-
.vscode/tasks.json생성 -
label이 launch.json의preLaunchTask와 일치 -
-g옵션 포함 (디버깅용) -
-std=c++17등 표준 옵션 프로젝트에 맞게 설정
디버깅 (launch.json)
-
.vscode/launch.json생성 -
program경로가 tasks.json 출력과 일치 -
preLaunchTask가 tasks.json의label과 일치 -
MIMode·miDebuggerPath가 OS에 맞음
VS Code C++ 환경 정리
VS Code에서 C++ 개발 환경을 구축하는 방법을 정리한다:
✅ IntelliSense 설정: .vscode/c_cpp_properties.json 파일로 자동 완성과 코드 네비게이션을 설정합니다. compilerPath를 정확히 맞추는 것이 가장 중요합니다.
✅ 빌드 자동화: .vscode/tasks.json 파일로 빌드 작업을 정의하고, Ctrl+Shift+B로 빠르게 빌드할 수 있습니다.
✅ 디버깅 설정: .vscode/launch.json 파일로 디버거를 구성하고, F5로 디버깅을 시작할 수 있습니다. preLaunchTask로 빌드와 연동하면 편리합니다.
✅ 멀티파일 프로젝트: 여러 소스 파일이 있는 경우, tasks.json의 args 배열에 모든 파일을 나열하거나, CMake를 사용합니다.
설정 후 먼저 확인할 네 가지
설정이 끝났다면 아래를 하나씩 확인해 보세요.
- 터미널에서
g++ --version(또는 사용 중인 컴파일러)이 되는가? -
c_cpp_properties.json의compilerPath가 그 실행 파일과 같은 경로인가? -
Ctrl+Shift+B로 빌드가 성공하는가? -
F5로 디버깅이 시작되는가? (preLaunchTask이름이tasks.json의label과 완전히 동일한지 확인)
막히면: tasks.json의 label과 launch.json의 preLaunchTask 오타·대소문자를 먼저 의심하라. 이 둘이 한 글자라도 다르면 “task not found”가 납니다.
💡 핵심 개념: macOS에서는
launch.json의MIMode를lldb로, Linux는 보통gdb로 맞추면 됩니다. Windows MinGW는gdb, MSVC로 빌드했다면cppvsdbg타입을 씁니다.
다음 글
프로젝트가 커지면 수동으로 빌드 명령어를 관리하는 것이 어려워집니다. 이때 필요한 것이 CMake입니다.
자주 묻는 질문 (FAQ)
Q. .vscode 폴더를 Git에 커밋해도 되나요?
A. tasks.json, launch.json, extensions.json처럼 팀 전체가 같이 쓰는 설정은 커밋하는 편이 온보딩에 도움이 됩니다. 다만 c_cpp_properties.json에 개인 PC의 컴파일러 절대 경로를 적어 두면 다른 사람 환경에서 깨지므로, 가능하면 compile_commands.json이나 CMake Tools 연동을 쓰고 개인 경로는 사용자 설정(settings.json의 사용자 범위)으로 옮기세요.
Q. Visual Studio와 VS Code 중 뭘 써야 하는가?
A. Visual Studio는 Windows 전용 통합 IDE로, 대규모 프로젝트·MSVC 디버깅에 강합니다. VS Code는 가볍고 크로스 플랫폼이라 Linux/macOS 개발, 원격 개발, 터미널 중심 워크플로우에 적합합니다. 팀 환경이 Windows만 쓰면 Visual Studio, 혼합이면 VS Code를 많이 씁니다.
같이 보면 좋은 글
- C++ 개발 환경 구축: 컴파일러 설치부터 Hello World까지
- GDB/LLDB 디버거 사용법
- CMake 입문
- CMakePresets.json으로 빌드 설정 통일하기
- C++ 컴파일러 비교 | GCC vs Clang vs MSVC, 어떤 걸 써야 할까?
- C++ 컴파일러 최적화 | PGO·LTO로
- C++ 멀티 컴파일러 전략과 CI/CD 파이프라인 구축 | 실무 가이드
- C++ 컴파일러 뭘 쓸까? GCC vs Clang vs MSVC 차이·선택 가이드
- GDB로 C++ 디버깅하기