C언어를 사용하기위해서는 많은 선택지가 있다
비쥬얼스튜디오, Dev-C++등의 개발환경이 있지만 무료이며 많은 사람들이 사용하는 VS code에서 구성하는 방법을 이글에서는 설명 한다
프로그램 설치 시작
C언어 사용을 위해서는 크게 2가지를 설치해야한다
VS code, MSYS2 를 설치 해야 한다
VS 코드 설치과정
https://code.visualstudio.com/
Visual Studio Code - Code Editing. Redefined
Visual Studio Code redefines AI-powered coding with GitHub Copilot for building and debugging modern web and cloud applications. Visual Studio Code is free and available on your favorite platform - Linux, macOS, and Windows.
code.visualstudio.com
위에 링크에 들어가서 설치 프로그램을 다운 받는다
윈도우 환경에서 구성하고 있기에 다운로드 윈도우 클릭한다
설치후 실행 시키면 아래와 같이 나온다
위 사진와 같이 과정을 따라서 프로그램 설치를 진행한다
VS code를 실행하면 아래같이 볼수 있다 이후 과정의 편리성을 위하여 언어 설정 부터 변경한다
(이미 구성이 되어있어 화면이 좀 다를수 있다)
화면 왼쪽 확장 탭으로 들어간다
아래 확장을 설치후 팝업메세지를 클릭하여 적용 및 재시작을 진행한다
만약 처음 프로그램 설치시 아래쪽 팝업에 언어 변경을 하겠냐고 물어보는것이 나온다면 진행하는것이 좀더 편하게 설정을 할수 있다
설정이 끝났다면 C언어 익스텐션을 설치 해야 한다
IDE를 설치 했는데 C언어를 사용하기 위해서 왜 또 설치하나 의문이 들수 있다.
익스텐션은 VScode 내에서 기능을 확장하고 자동화하기 위해서다. 이후 설치한 MinGW는 컴파일러와 디버거를 제공하지만, IDE 기능(코드 작성, 자동 완성, 디버깅 UI 등)은 제공하지 않는다. VScode는 IDE 역할을 하면서도 기본 기능이 제한적이기 때문에, 익스텐션을 통해 IDE로서의 기능을 추가해야 한다.
확장설치 하는곳에 가서 C를 검색하면 사진에 보이는 것이 있을것이다 익스텐션 Pack를 설치하면 필수 익스텐션이 같이 설치 된다
추가로 편리한 익스텐션이 하나 있어서 소개 한다
C언어는 대괄호가 중요한 언어이다 대괄호로 에러가 많이 나오기도 하는데 이를 좀 방지해주는 익스텐션이다
대괄호마다 색상을 다르게 하여 대괄호 개수가 다 맞는지 확인할수 있다
여기까지 하면 우선 VS code에서 할수 있는것이 마무리 할수 있다
MSYS2 설치
익스텐션 까지 설치 했는데 뭘또 설치하나 싶을것이다 아래와 같은 이유로 추가 프로그램 설치가 필요하다
1. 컴파일러 역할 (GCC 컴파일러 제공)
VScode는 통합 개발 환경(IDE)이지만, 컴파일러(compiler)가 내장되어 있지 않다.
C 언어로 작성한 소스 코드를 실행 가능한 파일로 변환하려면 컴파일러가 필수다.
MinGW에는 GCC (GNU Compiler Collection) 컴파일러가 포함되어 있어,
C/C++ 소스 코드를 .exe 실행 파일로 변환할 수 있다.
GCC란?
GCC는 리눅스와 유닉스에서 많이 사용하는 오픈소스 컴파일러로, C, C++, Fortran 등 다양한 언어를 지원한다.
2. 표준 라이브러리 (C 표준 라이브러리 제공)
C 프로그램은 printf, scanf와 같은 표준 라이브러리 함수를 자주 사용한다.
이러한 함수는 운영체제에 의존적이므로, Windows에서 사용하려면 Windows용 표준 라이브러리가 필요하다.
MinGW는 libc와 같은 C 표준 라이브러리를 포함하고 있어,
Windows 환경에서도 stdio.h, stdlib.h 같은 라이브러리를 사용할 수 있다.
libc란?
libc는 C 언어의 표준 라이브러리로, 운영체제의 기능(파일 입출력, 메모리 관리 등)을 사용할 수 있도록 지원하는 함수 모음이다.
3. Windows 명령어와 호환 (POSIX-like 환경 제공)
Windows의 파일 시스템이나 명령어는 리눅스/유닉스와 다르기 때문에 C 프로그램을 직접 실행하기 어렵다.
MinGW는 Windows용 POSIX-like 환경을 제공하여, 리눅스 명령어와 유사한 환경을 만들어 준다.
이를 통해 VScode의 터미널에서도 리눅스 명령어(gcc, make, ls, rm 등)를 사용할 수 있다.
POSIX란?
POSIX(Portable Operating System Interface)는 운영체제 간의 호환성을 보장하기 위해 정의한 표준 규격이다.
리눅스와 유닉스는 POSIX를 따르지만, Windows는 다르기 때문에, MinGW가 이를 보완한다.
4. 디버거 제공 (GDB 디버거)
VScode에서 브레이크포인트 설정, 스텝 실행, 변수 값 확인 등의 디버깅 기능을 사용하려면,
디버거(Debugger)가 필요하다. MinGW는 GDB 디버거를 제공하므로,
VScode의 디버그 기능과 연동해 C 프로그램의 디버깅을 할 수 있다.
GDB란?
GDB는 GNU Debugger의 약자로, 소스 코드를 한 줄씩 실행하거나, 변수 값을 추적하는 등 디버깅에 필수적인 기능을 지원한다.
MinGW-w64
www.mingw-w64.org
위 홈페이지에 들어가면 아래와 같은 화면이 나온다 다운로드 탭으로 들어가 보자
아래로 내려보면 MSYS2가 보이는것을 볼수 있다
이름(아이콘)을 클릭하면 설치 화면으로 넘어간다
그럼 아래로 내려가져서 깃허브 링크를 주는것을 볼수 있을것이다
깃허브를 클릭하면 설치파일을 다운로드 할수 있는 홈페이지로 넘어가진다
설치 프로그램을 다운로드 후 실행시킨다
순서에 따라 설치를 진행한다
설치 후 설치된 프로그램중 아래 프로그램을 설치 한다
이 글을 보는 사람 중 한 번이라도 개발 환경을 구축해본 경험이 있다면, 일반적인 설치 방식과는 약간 다르다고 느꼈을 수도 있다. 보통 MinGW를 직접 설치하는 경우가 많지만, 필자는 몇 가지 이유로 MinGW-W64를 기반으로 MSYS2를 활용한 설치 과정을 선택하였다. 아래에서 그 이유와 특징을 설명하고자 한다.
1. 64비트 환경 지원
기존 MinGW는 흔히 MinGW32라는 이름으로 불리며, 이름에서 알 수 있듯이 32비트 환경을 주로 지원한다. 하지만 최근의 PC와 윈도우 운영체제는 대부분 64비트 환경을 기본적으로 지원한다. 따라서, 32비트와 64비트를 모두 지원하는 MinGW-W64를 선택하는 것이 더 적합하다. 이를 통해 최신 하드웨어 및 소프트웨어 환경에서 최적화된 개발 환경을 구축할 수 있다.
2. 최신 GCC 버전 지원
MinGW-W64를 설치할 때 MSYS2를 선택한 이유는 MSYS2가 최신 GCC(GNU Compiler Collection) 버전을 제공하기 때문이다. 최신 GCC 버전을 사용하면, C 및 C++ 언어의 최신 표준(예: C++17, C++20 등)을 지원할 수 있어 더 많은 기능과 향상된 성능을 활용할 수 있다.
특히 최신 표준 지원은 코드의 호환성과 품질을 높이는 데 중요한 요소이다.
3. UCRT64: Universal C Runtime 기반 툴체인
UCRT64는 MSYS2 환경에서 제공되는 MinGW-W64의 C/C++ 런타임 라이브러리 중 하나로, **"UCRT (Universal C Runtime)"**를 기반으로 하는 64비트 툴체인이다.
ucrt64의 이름은 아래와 같은 의미를 가진다:
- u: Universal (범용)
- crt: C Runtime Library (C 런타임 라이브러리)
- 64: 64비트 환경
즉, ucrt64는 Universal C Runtime 기반의 64비트 환경을 위한 MinGW-W64 툴체인이다.
왜 UCRT인가?
Microsoft는 Windows 10부터 **UCRT (Universal C Runtime)**를 제공하기 시작하였다.
UCRT는 Windows 시스템 전체에서 사용되는 표준 C 런타임 라이브러리로 다음과 같은 특징을 가진다:
- Windows API와의 높은 호환성: Windows 운영체제와 밀접하게 통합되어 있으며, 최신 시스템과 최적의 호환성을 제공한다.
- 유지보수 용이성: Windows 업데이트를 통해 보안 및 성능 패치가 제공되며, 기존 msvcrt(Microsoft C Runtime)보다 안정적이다.
- 최신 프로젝트에 적합: 새로 작성되는 코드나 프로젝트에서 최신 Windows 시스템과의 호환성을 고려할 때 이상적인 선택이다.
ucrt64와 다른 환경과의 차이점
MSYS2는 MinGW-W64 툴체인을 다양한 환경으로 제공한다. 주요 환경의 특징은 다음과 같다:
환경설명타겟
mingw64 | msvcrt(Microsoft C Runtime)을 사용하는 64비트 툴체인 | Windows 64비트 |
mingw32 | msvcrt를 사용하는 32비트 툴체인 | Windows 32비트 |
ucrt64 | **UCRT (Universal C Runtime)**를 사용하는 64비트 툴체인 | Windows 64비트 |
ucrt64의 장점
- Windows API와의 호환성
UCRT는 Windows 10 이상 시스템의 표준 C 런타임 라이브러리로, 기존 msvcrt보다 더 높은 안정성과 유지보수를 제공한다. - 업데이트 및 유지보수
UCRT는 Windows 업데이트를 통해 관리되므로, 시스템 업데이트 시 보안 및 성능 패치가 자동으로 적용된다. - 새로운 프로젝트에 적합
최신 Windows 시스템에서 실행되는 새로운 코드나 프로젝트에 적합하며, 현대적인 개발 환경을 지원한다.
어떤 것을 선택해야 할까?
프로젝트 요구사항에 따라 적합한 툴체인을 선택하는 것이 중요하다:
- ucrt64: 최신 Windows 10/11 시스템을 대상으로 개발할 때 적합하다.
- mingw64: 오래된 Windows 시스템과의 호환성이 필요한 경우 적합하다.
- mingw32: 32비트 애플리케이션을 개발할 때 적합하다.
결론
위와 같은 이유로 필자는 64비트 지원, 최신 컴파일러 사용, UCRT 지원, 편리한 패키지 관리라는 장점을 제공하는 ucrt64 기반 MSYS2 설치를 선택하였다. 이는 최신 Windows 환경과의 호환성을 극대화하면서, 안정적이고 효율적인 개발 환경을 구축하는 데 기여한다. 앞으로 이러한 방식이 현대적인 프로젝트에 적합한 선택이 되기를 기대한다.
나머지 설치 과정을 진행한다
실행시키면 아래와 같은 커멘드 창을 볼수 있다
아래 명령어를 입력하여 기본 도구들 전체를 업그레이드를 진행한다
pacman -Syu
그럼 위와 같이 설치를 진행하다 중간에 다시 물어본다 Y를 입력하고 엔터를 누른다
기본 업그레이드가 끝났다면 필요한 것들의 설치를 진행한다
pacman -S --needed base-devel mingw-w64-x86_64-toolchain
해당 명령어로 MinGW-w64를 설치한다 설치과정은 위에 했던것과 같다
설치가 제대로 됬음을 확인하려면 버전확인 명령어를 입력해보면 된다
gcc --version
이처럼 나온다면 설치가 잘된것이다
이후 Path 설정이 필요하다
윈도우 검색창에 시스템 환경 변수 편집을 검색하여 들어간다
환경변수를 눌러 들어가면 아래와 같은 화면이 나온다
사용자 변수에서 아래로 내려보면 Path가 있는것을 볼수 있다 이를 선택하고 편집을 클릭한다
새로 만들기를 눌러 사진과 같이 MSYS2의 설치 경로를 입력해준다 만약 경로를 바꿨다면 찾아서 입력해주어야 한다
다시 VScode 로 돌아오자 원하는 이름의 폴더를 만들고 VScode에서 열어준다
ctrl +shift + p 를 입력하여 edit config에 들어간다
구성 편집에 들어가서 몇가지 설정을 해줘야 한다
1. 컴파일러 경로
UCTA64를 설치 했던 경로를 넣어줘야 한다
컴파일러 경로라고 되어있는 부분에서 gcc.exe 파일의 경로를 넣어주면 아래처럼 커멘드에 자동 설정했다는 문구가 나온다
그리고 아래로 내려가 위 사진처럼 C/C++ 표준을 가장 최신버전으로 설정한다
다 설정하고 나면 해당 부분에서 오류가 나오는것을 볼수 있을것이다
아래 사진 처럼 수정해주면 오류를 해결 할수 있다
여기까지 했다면 VScode를 종료후 재시작을 한다
새파일 생성으로 .c 파일을 생성해준다
파일 이름 생성시에 이름 뒤에 .c를 붙여주면 해당 확장자로 생성된다
아래와 같은 코드를 작성하였다
#include <stdio.h>
int main()
{
printf("hellow Word");
return 0;
}
그리고 새폴더 만들기를 하여 build 폴더를 만들어 준다(이후 실행파일이 들어갈 폴더이다)
그리고 ctrl +shift + p 를 입력하여 기본 빌드 작업 구성에 들어간다
그럼 우리가 입력한 경로의 활성 파일 빌드가 나온다 클릭한다
기본 tasks.json 파일이 생성된다 그럼 아래 내용으로 수정후 저장한다
{
"version": "2.0.0", // Task 버전 설정
"runner": "terminal", // 작업을 터미널에서 실행하도록 설정
"type": "shell", // 작업 유형을 'shell'로 지정
"echoCommand": false, // 실행할 명령어를 터미널에 표시하지 않음
"presentation": { // 터미널 출력 설정
"echo": false, // 실행 시 명령어 자체를 표시하지 않음
"clear": true, // 작업 실행 전 터미널을 깨끗하게 초기화
"showReuseMessage": false // 터미널 재사용 시 "이미 활성 상태" 메시지 표시하지 않음
},
"tasks": [
// C 빌드 작업
{
"label": "C: Build active file", // 작업 이름 (C 파일 빌드)
"command": "C:\\msys64\\ucrt64\\bin\\gcc.exe", // GCC 컴파일러 경로
"args": [ // 명령어에 전달할 인수 목록
"-std=c23", // C23 표준을 적용하여 컴파일
"${file}", // 현재 활성화된 파일을 컴파일 대상
"-o", // 출력 파일 지정 옵션
"${fileDirname}\\build\\${fileBasenameNoExtension}.exe" // 빌드된 실행 파일 저장 경로와 이름
],
"problemMatcher": ["$gcc"], // GCC 오류를 문제 패널에 표시
"group": {
"kind": "build", // 이 작업은 '빌드' 작업임을 나타냄
"isDefault": true // 기본 빌드 작업으로 설정
},
"detail": "Build active C file with GCC (C23 standard)." // 작업 설명
},
// C++ 빌드 작업
{
"label": "C++: Build active file", // 작업 이름 (C++ 파일 빌드)
"command": "C:\\msys64\\ucrt64\\bin\\g++.exe", // G++ 컴파일러 경로
"args": [ // 명령어에 전달할 인수 목록
"-std=c++23", // C++23 표준을 적용하여 컴파일
"${file}", // 현재 활성화된 파일을 컴파일 대상
"-o", // 출력 파일 지정 옵션
"${fileDirname}\\build\\${fileBasenameNoExtension}.exe" // 빌드된 실행 파일 저장 경로와 이름
],
"problemMatcher": ["$gcc"], // G++ 오류를 문제 패널에 표시
"group": {
"kind": "build", // 이 작업은 '빌드' 작업임을 나타냄
"isDefault": false // 기본 빌드 작업이 아님
},
"detail": "Build active C++ file with G++ (C++23 standard)." // 작업 설명
},
// 실행 작업
{
"label": "execute", // 작업 이름 (빌드된 실행 파일 실행)
"command": "cmd", // 명령 프롬프트(cmd)에서 실행
"group": {
"kind": "test", // 이 작업은 '테스트' 작업으로 분류
"isDefault": true // 기본 테스트 작업으로 설정
},
"args": [ // 명령어에 전달할 인수 목록
"/C", // 명령 실행 후 종료 옵션
"${fileDirname}\\build\\${fileBasenameNoExtension}" // 빌드된 실행 파일 경로와 이름
],
"presentation": {
"panel": "new" // 작업 실행 시마다 새 터미널 패널 생성
}
}
]
}
컴파일러 경로만 신경써서 확인한다
이제 단축키 설정으로 들어가자
ctrl +shift + p 를 입력하여 keyboard를 검색하여 기본설정: 바로가기 키 열기에 들어간다
검색창에 빌드 작업을 검색하여 소스가 사용자인것을 클릭후 왼쪽 위에 있는 바로가기키 열기 (JSON)을 클릭한다
그후 아래 코드를 붙여 넣기 한다
// Place your key bindings in this file to override the defaults
// 아래 키 바인딩을 파일에 넣어서 기본값을 덮어 씁니다.
[
{
"key": "ctrl+shift+b",
"command": "workbench.action.tasks.build",
},
{
"key": "ctrl+shift+t",
"command": "workbench.action.tasks.test",
}
]
그럼 .c 파일로 돌아가 ctrl+shift+b를 하게 되면 실행 파일이 만들어지고 ctrl+shift+t를 하게되면 실행되게 된다
만약 아래와 같은 오류가 나온다면 build 폴더를 만들지 않아서 이다
아무것도 나오지 않는다면 아래 사진처럼 실행파일이 생성된다
그리고 ctrl+shift+t를 하면 출력되는것을 볼수 있다
이로써 기본 환경 세팅이 완료되는것이다