본문 바로가기
Study/C_C++

VS Code (with Windows)

by 꼬부기가우는소리 2018. 7. 29.
728x90

작성 날짜: 2018. 7. 29


관련 출처:




Windows에서 VS Code 설치 및 C/C++ 컴파일



1. VS Code


VS Code(Visual Studio Code)는 Microsoft 사에서 만든 심플하고 강력한 소스 코드 편집기이다. VS Code는 Atom, Discord, Slack 등을 만든 Electron 기술을 사용하여 만들어 기존 Visual Studio 보다 가볍다. 디버깅 지원과 Git 제어, 구문 강조 기능등이 포함되어 있으며, 사용자가 편집기의 테마와 단축키, 설정 등을 수정할 수 있다.


VS Code는 깃허브가 개발한 일렉트론 프레임워크를 기반으로 구동된다. 그러나 같은 Electron 기반의 편집기 아톰을 포크한 것은 아니며, Visual Studio Online Editor(코드명 "모나코")를 기반으로 개발되었다.


Electron :

Electron(과거 명칭: 아톰 셸/Atom Shell)은 Cheng Zhao가 개발한 오픈 소스 프레임워크의 하나로, 지금은 깃허브에 의해 개발되고 있다. 원래 웹 애플리케이션을 위해 개발된 프런트엔드와 백엔드 구성 요소를 사용하여 데스크톱 그래픽 사용자 인터페이스 애플리케이션의 개발을 가능케 한다. 백엔드로는 Node.js 런타임을, 프론트엔드로는 크로미엄을 사용한다.


일렉트론은 여러 저명한 오픈 소스 프로젝트를 뒷받침하는 주요 GUI 프레임워크이며, 이 프레임워크를 사용한 프로젝트로는 깃허브의 아톰, Microsoft의 VS Code 소스 코드 편집기, 그리고 라이트 테이블 IDE, 또 디스코드 채팅 서비스를 위한 프리웨어 데스크톱 클라이언트 등이 있다.




2. VS Code와 MinGW 설치


VS Code는 Electron를 사용하여 만들었기 때문에, Windows, Linux, Mac OS에서 모두 지원한다. Linux와 Mac OS에서는 별도의 C/C++ 환경설정을 할 필요가 없지만, Windows 환경에서는 gcc 와 g++이 설치가 되어있지 않은 환경이기 때문에 별도의 환경설정이 필요하다.


MinGW :

MinGW(과거 이름: mingw32)는 마이크로소프트 윈도로 포팅한 GNU 소프트웨어 도구 모음이다. Minimalist GNU for Windows의 줄임말이다. MinGW는 Mingw32라고 말할 수도 있는데 Win32 API용 헤더를 제공하기 때문이다.


MinGW는 윈도 API를 구현할 수 있는 헤더 파일들을 가지고 있으며 이로써 개발자들이 "자유롭게 쓸 수 있는" 컴파일러인 GCC를 사용할 수 있다. 시그윈 포팅을 사용할 경우 컴파일한 프로그램 결과물이 유닉스 계통의 기능을 가상으로 구현하는 런타임에 의존하는 반면, MinGW의 경우 이러한 기능에 의존하지 않고 마이크로소프트 윈도 기반 프로그램들을 만들 수 있다.

이 MinGW 프로젝트는 두 개의 기본 꾸러미를 관리하고 배포한다. 첫째로는 포팅된 GCC 컴파일러들은 윈도 명령 줄에서, 아니면 IDE에 통합된 채로 쓸 수 있다. 아니면 둘째로는 MSYS(minimal system의 약자)를 쓸 수도 있는데, 이것은 가벼운 유닉스 계통의 셸 환경을 제공한다. 이러한 환경은 rxvt와 autoconf 스크립트들을 실행하는 데에 충분한 POSIX 도구들이 집약되어 있다.


* MinGW install : https://sourceforge.net/projects/mingw/?source=typ_redirect



설치 후, MinGW Installation Manager에서 아래와 같은 패키지를 선택 후, 메뉴의 [Install] - [Apply Changes] - [Apply] 를 눌러 설치한다.

  • mingw-developer-toolkit

  • mingw32-base

  • mingw32-gcc-g++

  • msys-base




설치한 MinGW를 환경변수에 등록한 뒤, cmd 창에서 gcc와 g++을 확인해 준다.






3. VS Code 컴파일 환경설정


설치된 VS Code를 실행시키면 아래와 같은 창이 나타난다.




VS Code는 안에 내장된 확장 마켓플레이스에서는 검색을 통해 쉽고 빠르게 확장기능을 설치할 수 있도록 편의성을 제공하고 있다. 아래와 같이 검색을 통해 원하는 확장기능을 찾아 설치가 가능하다.


C/C++ 사용을 위해 아래와 같은 확장기능을 설치해주도록 한다.



Code Runner :

Code Runner는 C/C++ 뿐만 아니라 다음과 같이 언어를 지원한다.


C, C++, Java, JavaScript, PHP, Python, Perl, Ruby, Go, Lua, Groovy, PowerShell, BAT/CMD, BASH/SH, F# Script, C# Script, VBScript, TypeScript, CoffeeScript, Scala, Swift, Julia, Crystal, OCaml Script, R, AppleScript, Elixir, Visual Basic .NET, Clojure, Haxe, Objective-C, Rust, Racket, AutoHotkey, AutoIt, Kotlin, Dart, Free Pascal, Haskell, Nim, D


세부 정보를 읽어보면, 다양한 환경설정에 대한 Configuration 이 나온다.


Configuration


Make sure the executor PATH of each language is set in the environment variable. You could also add entry into code-runner.executorMap to set the executor PATH. e.g. To set the executor PATH for ruby, php and html:


{

   "code-runner.executorMap": {

       "javascript": "node",

       "php": "C:\\php\\php.exe",

       "python": "python",

       "perl": "perl",

       "ruby": "C:\\Ruby23-x64\\bin\\ruby.exe",

       "go": "go run",

       "html": "\"C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe\"",

       "java": "cd $dir && javac $fileName && java $fileNameWithoutExt",

       "c": "cd $dir && gcc $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt"

   }

}



설치한 Code Runner를 사용해주기 위해 [파일] - [기본 설정] - [설정]에서 C/C++ 사용자 설정을 작성해주도록 한다.


화면의 좌측에는 기본 설정(Default)이 표시되고 우측에는 사용자 설정(Custom)이 표시가 된다. 여기에서 앞서 소개한 Configuration에서 C에 해당되는 부분을 가져와 작성해 주도록 한다.


"code-runner.executorMap": {
"c": "cd $dir && gcc $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt",
"cpp": "cd $dir && g++ $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt"
},



4. 한글 입출력 설정


윈도우 환경이라면 진행하기 전에 설정을 수정해야 한다. 해당 파일들의 인코딩을 따로 변경해주면 해결된다.


단, 변경 후 기존 코드의 한글이 깨져보이니 주의해야 한다.


앞서 환경 설정을 했던 것과 같이 메뉴에서 [파일] - [기본 설정] - [설정]을 선택한다. 검색 창에 unicode를 입력하면 관련 옵션을 확인할 수 있다. 블럭 설정한 부분을 복사하여 바로 오른쪽 창에 복사해줍니다.




기존에 있는 옵션 뒤에 콤마(,)를 붙이고 뒤에 붙여넣기 한 뒤, utf8을 euckr로 변경해준다. 해당 설정은 덮어쓰기가 되어 utf8 대신 euckr에 따라 인코딩이 된다.


// 파일을 읽고 쓸 때 사용할 기본 문자 집합 인코딩입니다. 이 설정은 언어별로 구성할 수도 있습니다.
"files.encoding": "euckr",


utf8 & euckr :

(출처: http://studyforus.tistory.com/167)

한글 인코딩 방식은 크게 두 가지, UTF-8 과 EUC-KR 방식으로 나뉜다.


UTF-8의 경우에는 조합형 방식의 문자집합(Charater Set)이면서, 유니코드 인코딩 방식중 하나이다. 유니코드 인코딩 방식에서 가장 대표적인 문자집합인데, 그 이유는 ASCII 문자들을 표현할 수 있기 떄문이다. 따라서 유니코드 인코딩 하면 UTF-8 방식을 많이 이야기한다.


초성, 중성, 종성을 각각 1바이트로 인식해서 일반적으로 한글을 3바이트로 인식하지만 공백이나 영문은 1바이트로 인식 한다. 또한 유니코드의 경우에는 다른 국가에서 한글 언어팩이 설치되지 않았다고 하더라도 한글 표현이 가능하다. 같은 방식으로 우리 나라에서도 다른 나라의 언어를 볼 수 있다. 따라서 다양한 언어로 작성되는 환경이나, 웹과 같은 다양한 국가의 사람들이 보는 경우에는 더 좋은 방식이다.


하지만, 윈도우의 인코딩 방식은 기본적으로 완성형이다.


EUC-KR 방식은 완성형 인코딩방식이고, 한글을 2바이트로 사용하는 문자집합 (Character Set)이다. 주로 2바이트권 문자에서 사용하는데, 문제는 EUC-KR을 사용하는 국가, 즉, 한글을 사용하는 곳에서만 제대로 문자가 보이는 단점이 있다. 한글과 영어만 사용하는 페이지에서 적합하다.



설정을 완료 후, 새 파일을 만들어서, 실행해보면 문제 없이 한글의 입출력이 되는 것을 확인할 수 있다.


#include <stdio.h>
int main()
{
printf("문자열을 입력후 엔터를 누르세요!\n");

char a[256];
scanf("%s", a);

printf(" \" %s \" 를 입력하셨네요.\n", a);
return 0;
}





5. 코드 컴파일 및 실행


Task Runner를 사용하면 Code Runner 확장을 사용할 때와 달리 상세한 컴파일 설정이 가능하다.


Task Runner :

VSCode는 Task runner로 외부의 툴을 VSCode와 연동시킬 수 있다. CLI로 실행되는 툴들을 VSCode에서 실행시킬 수 있는 수 있도록 하는 것이다.

반복되는 일련의 작업들을 자동화 하기 위해 Task Runner라는 하나의 앱을 사용하는데 비주얼 스튜디오 2015(Visual Studio 2015)는 Task Runner로서 가장 인기 있는 자바스크립트 기반의 Gulp와 Grunt를 지원한다.



VS Code의 메뉴에서 [작업] - [기본 빌드 작업 구성]을 선택한다. 템플릿에서 tasks.json 파일 만들기를 선택합니다.




Other 임의의 외부 명령을 실행하는 예를 선택한다.




탐색기에 tasks.json 파일이 추가되고 편집기에서 해당 파일이 열린다. 아래와 같이 컴파일에 필요한 정보들을 추가해 주고 Ctrl+S를 눌러 저장하도록 한다. (출처: http://webnautes.tistory.com/1158)


{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"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
}
}
},

//바이너리 실행(Windows)
{
"label": "execute",
"command": "cmd",
"group": "test",
"args": [
"/C", "${fileDirname}\\${fileBasenameNoExtension}"
]
}
]
}



단축키를 설정해준다. 메뉴에서 [파일] - [기본 설정] - [바로 가기 키]를 선택한다. 이미 설정되어 있는 단축키 목록을 보여준다. 대부분의 키조합이 이미 정의되어 있으므로 수정하기 위해 keybindings.json을 클릭해주도록 한다.




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


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



탐색기에서 임의로 작성한 test.cpp를 선택하고 Ctrl+Alt +C를 누르면 보이는 항목에서 save and compile for C++를 선택한다. 편집 중이던 모든 파일 저장되고 터미널에 컴파일 진행결과가 나타난다. 문제없이 컴파일이 완료되면 왼쪽 탐색기에 컴파일 결과물인 test.exe 파일이 보인다.




Ctrl+Alt+R을 누르면 보이는 execute를 선택한다. 컴파일된 파일의 실행 결과가 터미널에 나타난다.





6. 디버깅


진행하기 전에 위에서 작업했던 일부를 수정해야 한다. 프로젝트 폴더의 .vscode 폴더에 있는 tasks.json 파일을 열어서 컴파일 시 디버그 정보를 포함하도록 한다. 컴파일의 "args"에 "-g"를 추가해준다.


"tasks": [
//C++ 컴파일
{
"label": "save and compile for C++",
"command": "g++",
"args": [
"${file}",
"-g",
"-o",
"${fileDirname}/${fileBasenameNoExtension}"
],
"group": "build",



왼쪽 사이드바에서 디버그 아이콘을 클릭 후, 설정 아이콘을 클릭해준다.




C++ (GDB/LLDB)를 선택하면 launch.json 파일이 열립니다. 아래 세 부분을 수정해 준다. (출처: http://webnautes.tistory.com/1158)

  • "program": "${workspaceFolder}/add/add.exe"

  • "externalConsole": false

  • "miDebuggerPath": "C:/MinGW/bin/gdb.exe"

program은 디버깅할 컴파일된 실행파일의 경로 및 이름을 적어주면 된다.

{
// IntelliSense를 사용하여 가능한 특성에 대해 알아보세요.
// 기존 특성에 대한 설명을 보려면 가리킵니다.
// 자세한 내용을 보려면 https://go.microsoft.com/fwlink/?linkid=830387을(를) 방문하세요.
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) Launch",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/add.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
}
]
}
]
}



프로젝트 폴더의 .vscode 폴더에 저장되기 때문에 언제든 수정이 가능합니다.




원하는 줄번호 왼쪽을 클릭하면 빨간점으로  브레이크포인트가 추가된다. 해당 파일을 컴파일 후, 문제없이 실행파일이 생성되었다면 디버깅을 해볼 수 있다.


F5를 눌러서 디버깅을 시작하고 F11를 눌러서 한줄씩 실행한다. 변수 항목과 호출 스택 항목이 업데이트 되는 것을 확인할 수 있다.





'Study > C_C++' 카테고리의 다른 글

벡터 (vector)  (0) 2023.06.17
연산자  (0) 2023.06.15
표준 템플릿 라이브러리 (STL)  (0) 2023.06.13
형 변환  (0) 2023.06.07

댓글