[VScode]VScode에서 C/C++ 환경 만들기

maroo·2022년 7월 9일
4
post-custom-banner

0. 환경 구축 전...

컴파일, 디버깅, 빌드의 차이가 무엇일까?

VScode에서 C/C++환경을 구축하며 .c코드를 실행시켜보기 위해 삽질을 하면서 든 의문이다.
부끄럽지만 그동안 코드를 계속 쓰면서도 몰랐던 점이다. 디버깅에서 문제가 생겼다는데 빌드랑 다른 건가 싶고, 컴파일은 코드 돌리는 과정인가? 하는 정도의 느낌만 존재했다.

빌드(build)==컴파일(compile)+링크(link)

컴파일: 개발자들이 프로그래밍 언어로 만든 코드를 컴퓨터가 이해할 수 있는 기계어로 변환하는 과정.
즉, 컴파일은 "번역"이라고 할 수 있을 것 같다.

링크: 코드에는 개발자들이 직접 타이핑한 코드뿐만 아니라 라이브러리도 많은데, 이 라이브러리를 내 코드와 연결해주는 작업이 필요하다. 그 작업이 링크이다,
즉, 링크는 말 그대로 "연결"이라고 할 수 있을 것 같다.

빌드: 컴파일 및 링크, 즉 빌드를 해야 비로소 컴퓨터에서 실행할 수 있는 기계어 코드가 만들어지는 것.
즉, 나는 빌드를 "제출"이라고 이해했다.

디버깅(debugging): 코드에서 발생한 에러를 잡아내고, 수정하는 과정을 통칭하는 것.
즉, 디버깅은 "피드백" 이라고 할 수 있을 것 같다.

정리하고 나니 헷갈려서는 안 됐다는 생각이 들 정도로 다른 개념이다.. 당황스럽다.
앞으로는 모르면 바로바로 찾아서 정리하는 습관을 들여보자!

1. VScode 설치

https://code.visualstudio.com/

추가 작업 선택 시,
'PATH에 추가'를 꼭 체크한다.

2. VScode에서 C/C++ Extension 설치하기

3. VScode에서 작업폴더와 .cpp파일 만들기

폴더를 하나 생성해 열고, 그 폴더 안에서 test.cpp를 생성하자

주의사항: 경로에 한글을 포함하면 안 된다. 나중에 path문제로 오류가 난다.

4. MinGW 설치

Window에서 C/C++의 리눅스 전용 컴파일러인 gcc, g++를 설치하기 위해서는 MinGW라는 프로그램을 설치해야 한다.
https://sourceforge.net/projects/mingw/

Installation Directory가 C:\MinGW로 나올 텐데, 그대로 진행하는 것을 권장한다.

설치를 진행하고, MinGW installation Manager창에서 C/C++개발에 필요한 패키지 4개를 체크해야 한다.

선택할 때는 우클릭 "Mark for Installation"을 체크한다.

-mingw-developer-toolkit
-mingw32-base
-mingw32-gcc-g++
-msys-base

선택 후, Installation > Apply Changes > Apply > 설치 완료 후 Close

5. 환경 설정

(1)컴파일러 Path 등록
(2)세 가지 파일 설정

5-1. Windows 환경 변수 설정

컴파일러의 기본 위치를 path 경로에 등록하는 과정이다.
환경 변수 설정을 통해 C/C++ extension과 컴파일러와의 연결이 필요하다.

제어판 > 시스템 환경 변수 편집

고급 > 환경 변수 클릭

Path변수를 찾아 누르고 편집 버튼 클릭

환경 변수 편집에서 새로 만들기 버튼 클릭 > 'C:\MinGW\bin' 을 추가한 후 확인
('C:\MinGW\bin': 내가 MinGW를 C드라이브에 바로 설치했을 때 경로. 본인이 MinGW를 다른 곳에 설치했다면 그 경로대로 설정할 것)

참고로 나는 여기서 Path가 손상돼 있는 걸 발견해서,
https://jinseongsoft.tistory.com/2
이걸 참고해 echo %Path%를 해서,(%PATH%가 아니다! Path와 PATH는 다른 것 같다. 처음에 사이트에서 하는 대로 %PATH%로 했다가 애를 먹었다..)
Path를 새로 설정한 다음, 편집을 눌러 추가했다.

제대로 Path설정이 됐는지 확인하려면, 명령 프롬프트(cmd)를 열어서

gcc -v
g++ -v

를 입력하여 버전이 제대로 나오면 경로 설정이 제대로 된 것이다.

5-2-(1). VScode에서 c_cpp_properties.json 파일

c_cpp_properties.json 파일은 컴파일러가 설치된 경로를 설정하고, 빌드 기본 옵션들을 설정하는 파일이다.

명령팔레트 열기(Ctrl+Shift+P) > 'c/c++'검색 > 'C/C++: 구성 편집(UI)선택'
이 UntelliSense 구성 화면에서 다음과 같이 설정한다.

-구성이름: win32
-컴파일러 경로: c:/mingw/bin/g++.exe
-IntelliSense: gcc-x64
-C 표준: gun11
-C++ 표준: gun++14

이 설정을 마치면 .vscode 폴더와, c_cpp_properties.json 파일이 자동 생성된다.

5-2-(2). tasks.json 파일

tasks.json 파일은 기본 빌드 구성을 설정하는 파일이다.

.cpp파일을 열어 놓은 상태에서 빌드 단축기(Ctrl+Shift+B) > 'C/C++: g++.exe'옆의 설정 톱니바퀴 클릭 > tasks.json 파일 자동 생성

또는

.cpp파일을 열어 놓은 상태에서 터미널 > Configuration Default Build Task(기본 빌드 작업 구성) > 'C/C++: g++.exe'옆의 설정 톱니바퀴 클릭 > tasks.json 파일 자동 생성

그 후 tasks.json파일을 수정한다.
해당 내용을 복사 붙여넣기하면 된다.

{
    "version": "2.0.0",
    "runner": "terminal",
    "type": "shell",
    "echoCommand": true,
    "presentation": {
        "reveal": "always"
    },
    "tasks": [
        {
            "label": "save and compile for C++",
            "command": "g++",
            "args": [
                "${file}",
                "-g",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}"
            ],
            "group": "build",
            "problemMatcher": {
                "fileLocation": [
                    "relative",
                    "${workspaceRoot}"
                ],
                "pattern": {
                    "regexp": "^(.*):(\\d+):(\\d+):\\s+(warning error):\\s+(.*)$",
                    "file": 1,
                    "line": 2,
                    "column": 3,
                    "severity": 4,
                    "message": 5
                }
            }
        },
        {
            "label": "save and compile for C",
            "command": "gcc",
            "args": [
                "${file}",
                "-g",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}"
            ],
            "group": "build",
            "problemMatcher": {
                "fileLocation": [
                    "relative",
                    "${workspaceRoot}"
                ],
                "pattern": {
                    "regexp": "^(.*):(\\d+):(\\d+):\\s+(warning error):\\s+(.*)$",
                    "file": 1,
                    "line": 2,
                    "column": 3,
                    "severity": 4,
                    "message": 5
                }
            }
        },
        {
            "label": "execute",
            "command": "cmd",
            "group": "test",
            "args": [
                "/C",
                "${fileDirname}\\${fileBasenameNoExtension}"
            ]
        },
        {
            "type": "cppbuild",
            "label": "C/C++: gcc.exe 활성 파일 빌드",
            "command": "C:\\MinGW\\bin\\gcc.exe",
            "args": [
                "-g",
                "${file}",
                "-o",
                "${fileDirname}\\${fileBasenameNoExtension}.exe"
            ],
            "options": {
                "cwd": "${fileDirname}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "detail": "디버거에서 생성된 작업입니다."
        }
    ]
}

이 tasks.json 파일이 잘 생성되어 빌드가 잘 이루어지는지 확인하려면,
test.cpp파일에서 Ctrl+Shift+B를 해서 'g++'를 선택해 빌드한 다음, 작업 폴더에 test.exe파일이 생성되면 성공이다.
(g++를 선택하면 .cpp가 컴파일되고, gcc를 선택하면 .c컴파일이 될 것이다.)
다만 아직은 빌드만 성공한 것이지, 실행이 된 것은 아니다.
추후 실행파일을 실행해주는 Runner Extension을 추가 설치해 실행을 진행할 것이다.

5-2-(3). launch.json 파일

launch.json 파일은 디버깅을 위한 구성 파일이다.

.cpp파일을 열어 놓은 상태에서 디버그 > 구성 추가 > 'C++(GDB/LLDB)'선택 > 'g++.exe'선택 > launch.json파일 자동 생성

보통은 이 launch.json파일의 configuration내용이 채워져 있는데, 나의 경우 왜인지는 모르겠으나 빈약한 코드가 나왔다(...)

보통 케이스처럼 꽉 채워진 코드가 나올 경우,
간단한 수정만 해주면 된다.
externalConsole을 false에서 true로 바꿔 주자. 그래야 디버깅을 할 때 명령어들이 실행되는 것을 콘솔화면에서 볼 수 있다.

나처럼 빈약한 코드가 나올 경우, 내용을 채워주자.
구글링한 결과

{
    "version": "0.2.0",
    "configurations": [
    
        {
            "name":"(gdb)시작",
            "type": "cppdbg",
            "request": "launch",
            "program": "${fileDirname}\\${fileBasenameNoExtension}.exe",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": true,
            "MIMode": "gdb",
            "miDebuggerPath": "C:\\MinGW\\bin\\gdb.exe",
            "setupCommands": [
                {
                    "description": "gdb에 자동 서식 지정 사용",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ]
        }
    ]
}

와 같이 채우면 된다.

6. Extension추가 설치-code Runner

Code Runner를 Extension창에서 설치한 후, VScode를 껐다 재실행한다(그래야 정상 동작 가능)

test.cpp코드에서 마우스 우클릭으로 'Run Code'를 선택하거나, Ctrl+Alt+N 단축키를 눌러서 코드 실행이 잘 되는지 확인하자.

디버깅 테스트는 F5키를 눌러서 오른쪽에 터미널로 실행 결과가 뜨고, 왼쪽에는 변수와 조사식이 뜬다면 제대로 디버깅이 이루어지는 것이다.

  1. 그런데 내가 vscode에서
#include <iostream>
using namespace std;
int main() {
	const int Size=15;
	char name1[Size];
	char name2[Size] = "C++programing";

	cout << "안녕하세요, 저는 " << name2 << "입니다. 당신의 이름은? " << endl;
	cin.getline(name1,Size) >> name1;
	cout << name1 << "님, " << strlen(name1) << "자의 이름이 " << Size << "바이트 크기의 배열에 저장되었습니다." << endl;
	cout << "이름이 " << name1[0] << "자로 시작하는군요." << endl;
	cout << "제 이름의 첫글자는 " << name2[0] << "이랍니다." << endl;

	return 0;
}

이 코드를 실행했을 때 output탭에서 안녕하세요, 저는 C++programing입니다. 당신의 이름은? 만 출력되고, 입력을 받을 수 있게 나오지 않았다.
출력 탭이 읽기 전용으로 디폴트 설정되어 있다고 한다.
File > Preferences > Settings > Extensions > Code Run Configuration > 'Run in Terminal' 체크 > Ctrl+s

참고 사이트
https://www.youtube.com/watch?v=77v-Poud_io
https://www.youtube.com/watch?v=ii097ORUJ_A
https://jhnyang.tistory.com/440
https://rasino.tistory.com/307
https://jhnyang.tistory.com/430
https://songsmir.tistory.com/3
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=mincoding&logNo=221733289320

위에 거 다 치우고 공식 사이트를 참고해야겠다...
지금 대충은 됐는데 빌드 작업에 문제가 있다.
'빌드는 완료됐지만, 오류가 발생했습니다" 가 자꾸 발생한다. 그래서 단순 출력 문제는 output이 나오는데, 사용자로부터 입력을 받는 코드 등이 제대로 실행되지 않는다.
빌드 구성을 설정하는 tasks.json파일에 문제가 있나 보다.
저 블로그들은 다 조금씩 달라서 공식 사이트를 참고해야 제대로 알 수 있을 것 같다.
https://code.visualstudio.com/docs/cpp/config-mingw

profile
할수이따 ~
post-custom-banner

0개의 댓글