[솦토링 1주차] GCC 컴파일러 설치 및 VSCode Debugging 도구 사용

반야·2025년 4월 8일
0

솦토링

목록 보기
1/2
post-thumbnail

교내에서 진행하는 멘토링 프로그램에 멘토로 참여하게 되었고, C/C++ 멘토링을 담당할 예정이다. 아래는 멘토링을 진행하기 위해, 정리한 자료들을 모아둔 것이다. 1학년 때 열심히 인터넷을 헤맸던 기억이 있는데, 다시 자료들을 모으다보니 그때 기억도 새록새록 나는 것 같다.

1. VSCode 설치

IDE는 통합 개발 환경(Integrated Development Environment)을 뜻하며, 프로그래밍을 효율적으로 할 수 있도록 도와주는 소프트웨어 애플리케이션이며, 대표적으로, Visual Studio, Visual Studio Code(VSCode), eclipse, IntelliJ IDEA, Android Studio 등이 있다.

Visual Studio는 C/C++ 개발에서 주로 사용하며, VSCode는 Visual Studio 가벼운 버전으로 볼 수 있다. 다만, VSCode에서 C/C++ 컴파일을 진행하려면 추가적인 설정이 필요하다.

VSCode는 Python 개발, 프론트엔드 웹 개발(HTML, CSS, TS 등)에도 주로 활용되는 등 활용 범주가 굉장히 넓고 여러 확장들이 존재하며, WSL, SSH, Docker, Github 등와 연동해서 사용하는 데도 편리하다.

eclipse는 2학년 때 주로 수강하는 ‘JAVA 프로그래밍 실습’ 수업에서 사용하게 될 Java를 기반으로 하는 IDE이다. 그러나 본인은 IntelliJ IDEA(Java, Kotlin)를 더 편하게 사용한 경험이 있다.

Android Studio는 3학년에 주로 수강하는 ‘모바일 앱 프로그래밍 실습’ 수업에서 사용하게 될 IDE이다. IntelliJ IDEA를 기반으로 만들어졌다고 한다.

🔗 VSCode 설치

VSCode 확장 설치

  1. 한국어 언어 확장 설치
  1. Python 확장 설치

    • (선택) Black Formatter 설치
  1. C/C++ 확장 설치
  2. Makefile 확장 설치




2. Anaconda 설치

Anaconda는 Python 패키지와 환경을 쉽게 관리할 수 있도록 한다. 또한, Jupyter Notebook(.ipynb )을 쉽게 설치할 수 있는 방법이기도 하다.

신입생 프로그래밍언어(Python) 사전교육에 참여하였다면 이미 설치가 되어있을 것이다.

특히 인공지능 분야에서 각 모델에 맞는 Python 버전 및 패키지 버전 (예. python 3.11.11, numpy =1.25.0, tensorflow=2.15.0 등)이 설치된 가상환경을 만들어 편리하게 사용하기 위해 사용한다.

데이터 분석에 있어서도 Jupyter Notebook은 각 셀을 개별적으로 실행하면서, 데이터 전처리, 시각화, 모델링 등을 단계별로 수행하고 결과를 바로 확인할 수 있다는 점에서 매우 편리하게 활용되고 있다. 또한, Markdown 문서도 지원하고 있다. 🔗 Markdown 문법 설명

🔗Anaconda 설치

Python이 이미 설치되어 있는 경우, Anaconda와 충돌이 날 수 있으므로 Python을 삭제하고나서 Anaconda를 설치하거나, 그냥 Python이 설치되어 있다는 것에 만족하고 Anaconda를 설치하지 않는 방법이 있다.



cmd에서 python --version명령어를 실행하여 제대로 설치가 완료되었는지 확인한다.

VSCode에서 간단한 python 코드 작성 후, 우측 상단의 실행 버튼을 눌러 코드를 실행할 수 있다.


3. MinGW(Minimalist GNU for Windows) 설치

MinGW는 GNU gcc 컴파일러(C언어 컴파일)를 Windows 환경에서 사용할 수 있도록 만든 도구이다.

VSCode Debugging 도구를 사용할 생각이 없다면 굳이 설치하지 않아도 괜찮다. WSL에서 GCC를 활용해서도 C언어 컴파일이 가능하기 때문이다. (다음 자료 내용)

🔗MinGW-w64 설치

다운받은 .zip 파일을 압축 해제하고, mingw64 폴더를 C 드라이브(C:\mingw64)로 이동시킨다.

환경변수 검색 후, 시스템 환경 변수 편집 클릭



Path 선택 후, 편집 클릭

새로 만들기 클릭 후, C:\mingw64\bin 입력

cmd에서 gcc --version명령어를 실행하여 제대로 설치가 완료되었는지 확인한다.


4. VSCode에서 C/C++ 컴파일

C/C++을 사용할 폴더를 열고 (예. C), 내부에 .vscode 폴더(VSCode 설정 파일들을 저장하는 곳)를 생성한다. 이후, 해당 폴더 내부에 각각 c_cpp_properties.json 파일과 tasks.json 파일을 생성한다.

※ 이때, 폴더의 경로에 한국어가 있으면 오류가 발생한다. (예. 사용자명이 한국어인 경우)

c_cpp_properties.json 파일 내용

{
    "configurations": [
        {
            "name": "Win32",
            "includePath": [
                "${workspaceFolder}/**"
            ],
            "defines": [
                "_DEBUG",
                "UNICODE",
                "_UNICODE"
            ],
            "windowsSdkVersion": "10.0.22000.0",
            "compilerPath": "C:/mingw64/bin/g++.exe",
            "cStandard": "c17",
            "cppStandard": "c++17",
            "intelliSenseMode": "windows-gcc-x64"
        }
    ],
    "version": 4
}

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}"
            ]
        }
    ]
}

C/C++ 컴파일 및 실행

테스트를 위해, 간단한 C언어 코드를 작성한다.

#include <stdio.h>

int main() {
    printf("Hello, world!\n");
    return 0;
}

설정에서 바로 가기 키로 들어가, ‘작업: 빌드 작업 실행’과 ‘작업: 테스트 작업 실행’의 단축키를 각각
Ctrl + Alt + CCtrl + Alt + R로 변경한다.

이후

  • Ctrl + Alt + C를 눌러 save and compile for C 작업으로 컴파일을 진행하고,
  • Ctrl + Alt + R을 누르면 생성된 실행 파일(.exe)이 실행된다.


5. VSCode Debugging 도구 사용

프로그램이 내가 의도한대로 잘 동작하고 있는지 확인하는 방법은 무엇일까? 혹은 내가 작성한 프로그램에서 의도치 않은 오류가 발생하고 있는 경우에는 어떻게 오류의 발생 원인을 발견할 수 있을까?

  1. 프로그램의 실행 값이 올바른지 확인한다.
    → 모든 경우에 대해 실행 값이 올바를 것이라고 확신할 수 있을까?
  2. 프로그램의 중간마다 printf를 활용해 변수들의 값을 확인한다.
    → 변수가 너무 많으면 어떡하지? 그리고 매번 printf를 작성하는 것이 귀찮지 않을까?
  3. 프로그램의 끝에서부터 주석 처리를 진행하며, 어느 부분에서 오류를 발생시키는지 확인한다.
    → 이것만으로는 오류의 발생 원인을 찾기에 부족할 수 있지 않을까?

따라서 프로그램의 실행을 한 줄씩 따라가며, 동시에 코드 실행에 따라 변화하는 변수의 값을 확인할 수 있도록(약간의 제약이 있긴 하지만…) 도와주는 Debugging 도구를 VSCode에서 사용해보자.

.vscode 폴더 내부에 launch.json 파일을 생성한다.

launch.json 파일 내용

{
    "version": "0.2.0",
    "configurations": [
        {
            "name":"build and debug for C++",
            "type": "cppdbg",
            "request": "launch",
            "program": "${fileDirname}\\${fileBasenameNoExtension}.exe",
            "args": [],
            "stopAtEntry": false,
            "cwd": "C:/mingw64/bin",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "miDebuggerPath": "C:\\mingw64\\bin\\gdb.exe",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ],
            "preLaunchTask": "save and compile for C++"
        },
        {
            "name":"build and debug for C",
            "type": "cppdbg",
            "request": "launch",
            "program": "${fileDirname}\\${fileBasenameNoExtension}.exe",
            "args": [],
            "stopAtEntry": false,
            "cwd": "C:/mingw64/bin",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "miDebuggerPath": "C:\\mingw64\\bin\\gdb.exe",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ],
            "preLaunchTask": "save and compile for C"
        }
    ]
}

C/C++ 디버깅

테스트를 위해, 간단하지 않은 C언어 코드를 작성한다.

🔗아래 코드와 관련된 문제(1541번: 잃어버린 괄호)

#include <stdio.h>
#include <string.h>

int main()
{
    char exp[51];
    scanf("%s", exp);

    int result = 0, flag = 0, num = 0;
    char op = 0;
    for (int i = 0; i < strlen(exp); i++)
    {
        if ('0' <= exp[i] && exp[i] <= '9')
        {
            num *= 10;
            num += exp[i] - '0';
            continue;
        }

        if (op == 0)
            result = num;
        else if (op == '+')
        {
            if (flag)
                result -= num;
            else
                result += num;
        }
        else
        {
            flag = 1;
            result -= num;
        }
        op = exp[i];
        num = 0;
    }

    // 마지막 숫자 처리
    if (op == 0)
        result = num;
    else if (op == '+')
    {
        if (flag)
            result -= num;
        else
            result += num;
    }
    else
    {
        flag = 1;
        result -= num;
    }

    printf("%d\n", result);

    return 0;
}
  1. 코드 옆 빨간점을 클릭하여 중단점(프로그램 실행이 멈추는 부분)을 추가하고,
    build and debug for C을 선택해 디버깅을 시작한다.
  2. 디버깅 시작 후, 등장한 터미널에 55-50+40을 입력하여 넣는다.
  3. F10이나 좌상단 버튼을 눌러 코드를 한 줄씩 실행할 수 있다.
    만약, 함수 내부에 들어가지 않도록 한 줄씩 실행하고 싶다면 F11이나 좌상단 두번째 버튼을,
    다음 중단점으로 이동하고 싶다면 F5이나 좌상단 첫번째 버튼을 이용한다.
  4. 결과값으로 55-(50+40), 즉 -35가 나오는 것을 확인할 수 있다.


6. (선택) VSCode에서 Formatter 사용

변수/함수/클래스명을 작성하는데 있어서 여러 코드 스타일들이 존재하고 있다. 대표적으로,

코드 스타일예시설명
Camel CasemyVariableName소문자로 시작하여, 단어의 경계마다 대문자를 사용한다. (Java, JavaScript 등에서 많이 사용)
Pascal CaseMyVariableName모든 단어의 첫 글자를 대문자로 한다. (주로 클래스명에 사용)
Snake Casemy_variable_name단어 사이를 _로 구분한다. (Python에서 주로 사용)
SCREAMING_SNAKE_CASEMY_CONSTANT_NAME상수명을 표현할 때 주로 사용한다.

가 있다.

다른 사람들과 협업할 때는 주로 이러한 세세한 부분들을 통일하여 코드의 가독성을 높힌다. 또한, Github를 통한 버전 관리 시, 코드 스타일 차이로 인한 불필요한 변경사항을 줄일 수 있다.

그러나 띄어쓰기(공백)와 같은 세부적인 스타일은 사람마다 편차가 크고, 개발자가 매번 일관되게 관리하기 어려운 부분이다.

// 1번 예시
if(x==5){console.log("hi");}
// 2번 예시
if (x == 5) {
	console.log("hi");
}
// 3번 예시
if (x == 5) 
{
	console.log("hi");
}

따라서 자동 코드 Fomatter를 활용해, 스타일을 통일하는 것이 협업과 유지보수 측면에서 효과적이다.

아래와 같이 설정에 들어가, Formatter 사용을 설정한다.

*Python에서는 Black Formatter로 설정한다.

이후 작성한 코드를 저장하면, 자동으로 1, 2번 예시를 3번 예시로 포맷팅을 진행하는 것을 볼 수 있다.

profile
𝚂𝙺𝙺𝚄 𝙲𝚂𝙴 𝟸𝟹

0개의 댓글