티스토리 뷰
VSCode에서 C/C++ 코드를 실행하기 위해서는 별도의 설정 과정이 필요하다. 하다가 던져버릴 뻔 했지만 아무튼 성공했으므로 이 좌충우돌 과정을 공유해보려고 한다.
진행 순서는 다음과 같다.
2. VSCode에서 C/C++ Extenstion 설치
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 파일을 실행시키면 다음과 같이 설치 관리창이 뜬다.
다음 4개의 패키지를 설치해야 한다.
✅ mingw-deveoper-toolkit
✅ mingw32-base
✅ mingw32-gcc-g++
✅ msys-base
각 패키지를 클릭한 후 Mark for Inatallation 메뉴를 다시 클릭하여 설치할 패키지 총 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 파일이 자동으로 생성된다.
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
}
tasks.json 파일
빌드를 위한 task를 정의하는 tasks.json 파일도 생성해주어야 한다.
F1을 눌러 Tasks: Configure Task → Create tasks.json file from template → Others 선택하면 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 선택 시 사용자에게 다음과 같이 보여진다.
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"
로 바꿔주었다.
4. 단축키 설정
F1 → Preferences: 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 파일이 자동 생성된다.
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
- spring aop
- FrontController
- QueryDSL
- servlet filter
- ParameterizedTest
- Git
- Java
- Transaction
- spring
- github
- vscode
- 전략 패턴
- 템플릿 콜백 패턴
- C++
- Gitflow
- facade 패턴
- Front Controller
- 단위 테스트
- rest api
- mockito
- spring boot
- Assertions
- 모두의 리눅스
- JPA
- SSE
- junit5
- 서블릿 컨테이너
- Linux
- 디자인 패턴
- Spring Security
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |