MinGW와 함께 GCC 사용[Using GCC with MinGW]
이 자습서에서는 mingw-w64 의 GCC C++ 컴파일러(g++) 및 GDB 디버거를 사용하여 Windows에서 실행되는 프로그램을 생성하도록 Visual Studio Code를 구성합니다.
VS Code를 구성한 후 VS Code에서 간단한 Hello World 프로그램을 컴파일하고 디버그합니다. 이 자습서에서는 GCC, GDB, Mingw-w64 또는 C++ 언어에 대해 설명하지 않습니다. 이러한 주제에 대해서는 웹에서 사용할 수 있는 좋은 리소스가 많이 있습니다.
문제가 있는 경우 VS Code 설명서 리포지토리 에서 이 자습서에 대한 문제를 자유롭게 제출하십시오 .
전제 조건[Prerequisites]
이 자습서를 성공적으로 완료하려면 다음 단계를 수행해야 합니다.
- 비주얼 스튜디오 코드를 설치합니다 .
- VS Code용 C/C++ 확장을 설치합니다 . 확장 보기( Ctrl+Shift+X ) 에서 'c++'를 검색하여 C/C++ 확장을 설치할 수 있습니다 .
- GCC, Mingw-w64 및 기타 유용한 C++ 도구와 라이브러리의 최신 네이티브 빌드를 제공하는 MSYS2를 통해 Mingw -w64의 최신 버전을 받으세요 . MSYS2 페이지에서 최신 설치 프로그램을 다운로드하거나 설치 프로그램에 대한 이 링크를 사용할 수 있습니다 .
- MSYS2 웹사이트 의 설치 지침 에 따라 Mingw-w64를 설치합니다. 필요한 각각의 시작 메뉴와 명령을 실행하도록 주의하십시오 .pacman
- Mingw-w64 툴체인을 설치합니다( pacman -S --needed base-devel mingw-w64-x86_64-toolchain). pacmanMSYS2 터미널에서 명령을 실행합니다 . 그룹의 모든 구성원을 설치하려면 기본값을 승인하십시오 toolchain.
- 다음 단계를 사용하여 Mingw-w64 폴더의 경로를 binWindows 환경 변수에 추가합니다.PATH
- Windows 검색 표시줄에 '설정'을 입력하여 Windows 설정을 엽니다.
- 계정의 환경 변수 편집을 검색하십시오 .
- 사용자 변수Path 에서 변수를 선택한 다음 편집을 선택합니다 .
- 새로 만들기를 선택 하고 Mingw-w64 대상 폴더 경로를 시스템 경로에 추가합니다. 정확한 경로는 설치한 Mingw-w64 버전과 설치 위치에 따라 다릅니다. 위의 설정을 사용하여 Mingw-w64를 설치한 경우 경로에 다음을 추가하십시오 C:\msys64\mingw64\bin.
- 확인을 선택하여 업데이트된 PATH를 저장합니다. 새 PATH 위치를 사용하려면 콘솔 창을 다시 열어야 합니다.
MinGW 설치 확인[Check your MinGW installation]
Mingw-w64 도구가 올바르게 설치되고 사용 가능한지 확인하려면 새 명령 프롬프트를 열고 다음을 입력하십시오.
gcc --version
g++ --version
gdb --version
- 예상 출력이 표시되지 않거나 인식된 명령이 아닌 경우 PATH 항목이 컴파일러가 있는 Mingw-w64 바이너리 위치와 일치하는지 확인하십시오 g++. gdb해당 PATH 항목에 컴파일러가 없으면 MSYS2 웹 사이트 의 지침에 따라 Mingw-w64를 설치했는지 확인하십시오.
- gcc올바른 출력이 있지만 가 아닌 경우 gdbMingw-w64 도구 세트에서 누락된 패키지를 설치해야 합니다.
- 패키지 누락은 mingw-w64-gdb"miDebuggerPath의 값이 잘못되었습니다." 오류의 원인 중 하나입니다. PATH가 올바른 경우 컴파일을 시도할 때 메시지가 표시됩니다.
헬로 월드 만들기[Create Hello World]
Windows 명령 프롬프트에서 projects모든 VS Code 프로젝트를 배치할 수 있는 빈 폴더를 만듭니다. 그런 다음 이라는 하위 폴더를 만들고 helloworld폴더로 이동한 후 다음 명령을 입력하여 해당 폴더에서 VS Code를 엽니다.
mkdir projects
cd projects
mkdir helloworld
cd helloworld
code .
코드 ." 명령은 "작업 공간"이 되는 현재 작업 폴더에서 VS Code를 엽니다. 예, 본인이 만든 폴더이므로 작성자를 신뢰합니다를 선택하여 작업 영역 신뢰 대화 상자를 수락합니다 .
자습서를 진행하면서 .vscode작업 영역의 폴더에 생성된 세 개의 파일을 볼 수 있습니다.
- tasks.json(조립 지침)
- launch.json(디버거 설정)
- c_cpp_properties.json(컴파일러 경로 및 IntelliSense 설정)
소스 코드 파일 추가[Add a source code file]
파일 탐색기 제목 표시줄에서 새 파일 버튼을 선택하고 파일 이름을 helloworld.cpp.
Hello World 소스 코드 추가
이제 이 소스 코드를 붙여넣습니다.
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main()
{
vector<string> msg {"Hello", "C++", "World", "from", "VS Code", "and the C++ extension!"};
for (const string& word : msg)
{
cout << word << " ";
}
cout << endl;
}
이제 Ctrl+S를 눌러 파일을 저장합니다. 방금 추가한 파일이 VS Code의 사이드바에 있는 파일 탐색기 보기( Ctrl+Shift+E )에 어떻게 나타나는지 확인하십시오.
기본 파일 메뉴에서 자동 저장을 선택하여 자동 저장을 활성화하여 파일 변경 사항을 자동으로 저장할 수도 있습니다 .
가장 왼쪽에 있는 활동 표시줄을 사용하면 검색 , 소스 제어 및 실행 과 같은 다양한 보기를 열 수 있습니다 . 이 자습서의 뒷부분에서 실행 보기를 살펴보겠습니다 . VS Code 사용자 인터페이스 설명서 에서 다른 보기에 대해 자세히 알아볼 수 있습니다 .
참고 : C++ 파일을 저장하거나 열면 새로운 기능과 수정 사항을 테스트할 수 있는 내부자 버전의 가용성에 대한 C/C++ 확장의 알림이 표시될 수 있습니다. X( 알림 지우기 ) 를 선택하여 이 알림을 무시할 수 있습니다 .
IntelliSense 살펴보기[Explore IntelliSense]
새 파일에서 또는 helloworld.cpp위로 마우스를 가져가면 유형 정보를 볼 수 있습니다. 변수 선언 후 멤버 함수를 호출할 때와 마찬가지로 입력을 시작합니다 . 모든 멤버 함수를 표시하는 완성 목록과 개체에 대한 유형 정보를 표시하는 창이 즉시 표시되어야 합니다 .vectorstringmsgmsg.msg
Tab 키를 눌러 선택한 구성원을 삽입할 수 있습니다. 그런 다음 여는 괄호를 추가하면 함수에 필요한 인수에 대한 정보가 표시됩니다.
helloworld.cpp 실행[Run helloworld.cpp]
C++ 확장은 컴퓨터에 설치한 C++ 컴파일러를 사용하여 프로그램을 빌드합니다. helloworld.cppVS Code에서 실행 및 디버그를 시도하기 전에 C++ 컴파일러가 설치되어 있는지 확인하십시오 .
- helloworld.cpp활성 파일이 되도록 엽니 다.
- 편집기의 오른쪽 상단에 있는 재생 버튼을 누릅니다.
- 시스템에서 감지된 컴파일러 목록에서 C/C++: g++.exe 빌드 및 디버그 활성 파일을 선택합니다 .
를 처음 실행할 때만 컴파일러를 선택하라는 메시지가 표시됩니다 helloworld.cpp. 이 컴파일러는 파일에서 "기본" 컴파일러로 설정됩니다 tasks.json.
- 빌드가 성공하면 프로그램의 출력이 통합 터미널 에 나타납니다 .
프로그램을 처음 실행하면 C++ 확장이 tasks.json프로젝트의 .vscode폴더에서 찾을 수 있는 를 만듭니다. tasks.json빌드 구성을 저장합니다.
새 tasks.json파일은 아래 JSON과 유사해야 합니다.
{
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: g++.exe build active file",
"command": "C:\\msys64\\mingw64\\bin\\g++.exe",
"args": [
"-fdiagnostics-color=always",
"-g",
"${file}",
"-o",
"${fileDirname}\\${fileBasenameNoExtension}.exe"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": ["$gcc"],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "Task generated by Debugger."
}
],
"version": "2.0.0"
}
참고 : 변수 참조tasks.json 에서 변수에 대해 자세히 알아볼 수 있습니다 .
이 command설정은 실행할 프로그램을 지정합니다. 이 경우 g++입니다. 배열 args은 g++에 전달될 명령줄 인수를 지정합니다. 이러한 인수는 컴파일러에서 예상하는 순서대로 지정해야 합니다.
이 작업은 g++에게 활성 파일( ${file})을 가져와서 컴파일하고 현재 디렉토리( ${fileDirname})에 활성 파일과 이름은 같지만 확장자 .exe( ${fileBasenameNoExtension}.exe) 가 있는 실행 파일을 생성하도록 지시합니다 helloworld.exe.
값 label은 작업 목록에 표시되는 값입니다. 원하는 대로 이름을 지정할 수 있습니다.
값 detail은 작업 목록에서 작업에 대한 설명으로 사용할 것입니다. 유사한 작업과 구별하기 위해 이 값의 이름을 바꾸는 것이 좋습니다.
지금부터 재생 버튼은 tasks.json프로그램을 빌드하고 실행하는 방법을 알아내기 위해 읽을 것입니다. 에서 여러 빌드 작업을 정의할 수 tasks.json있으며 기본값으로 표시된 작업은 재생 버튼에서 사용됩니다. 기본 컴파일러를 변경해야 하는 경우 작업: 기본 빌드 작업 구성을 실행할 수 있습니다 . 또는 tasks.json이 세그먼트를 교체하여 파일을 수정하고 기본값을 제거할 수 있습니다.
"group": {
"kind": "build",
"isDefault": true
},
이것으로:
"group": "build",
tasks.json 수정[Modifying tasks.json]
tasks.json와 같은 인수를 사용하여 여러 C++ 파일을 빌드하도록 수정할 수 있습니다 . "${workspaceFolder}/*.cpp"이렇게 하면 현재 폴더의 ${file}모든 파일이 빌드됩니다 . 하드 코딩된 파일 이름(예: )으로 .cpp대체하여 출력 파일 이름을 수정할 수도 있습니다 ."${fileDirname}\\${fileBasenameNoExtension}.exe""${workspaceFolder}\\myProgram.exe"
helloworld.cpp 디버그[Debug helloworld.cpp]
- helloworld.cpp활성 파일이 되도록 로 돌아갑니다 .
- 편집기 여백을 클릭하거나 현재 줄에서 F9를 사용하여 중단점을 설정합니다.
- 재생 버튼 옆의 드롭다운에서 Debug C/C++ File 을 선택합니다 .
- 시스템에서 감지된 컴파일러 목록에서 C/C++: g++ 빌드 및 디버그 활성 파일을 선택합니다 (컴파일러를 처음 실행/디버그할 때만 선택하라는 메시지가 표시됨 helloworld.cpp).
재생 버튼에는 C/C++ 파일 실행 및 C/C++ 파일 디버그의 두 가지 모드가 있습니다 . 마지막으로 사용한 모드로 기본 설정됩니다. 재생 버튼에 디버그 아이콘이 표시되면 드롭다운을 사용하는 대신 재생 버튼을 클릭하여 디버그할 수 있습니다.
디버거 살펴보기[Explore the debugger]
코드 단계별 실행을 시작하기 전에 잠시 시간을 내어 사용자 인터페이스의 몇 가지 변경 사항을 살펴보겠습니다.
- 통합 터미널은 소스 코드 편집기 하단에 나타납니다. 디버그 출력 탭 에서 디버거가 실행 중임을 나타내는 출력을 볼 수 있습니다.
- 편집기는 디버거를 시작하기 전에 중단점을 설정한 줄을 강조 표시합니다.
- 왼쪽의 실행 및 디버그 보기에는 디버깅 정보가 표시 됩니다 . 이 자습서의 뒷부분에서 예제를 볼 수 있습니다.
- 코드 편집기 상단에 디버깅 제어판이 나타납니다. 왼쪽에 있는 점을 잡아서 화면 주위로 이동할 수 있습니다.
코드 단계별 실행[Step through the code]
이제 코드를 단계별로 실행할 준비가 되었습니다.
- 디버깅 제어판에서 Step Over 아이콘을 클릭하거나 누르십시오 .이렇게 하면 프로그램 실행이 for 루프의 첫 번째 줄로 진행되고 변수가 생성되고 초기화될 때 호출되는 vector및 클래스 내의 모든 내부 함수 호출을 건너뜁니다 . 왼쪽의 변수 창 에서 변경 사항을 확인합니다 .stringmsg이 경우 루프의 변수 이름이 이제 디버거에 표시되지만 명령문이 아직 실행되지 않았으므로 이 시점에서 읽을 것이 없기 때문에 오류가 예상됩니다. 그러나 해당 문이 완료되었으므로 의 내용이 msg표시됩니다.
- 이 프로그램의 다음 명령문으로 진행하려면 Step over를 다시 누르십시오 (루프를 초기화하기 위해 실행되는 모든 내부 코드 건너뛰기). 이제 변수 창에 루프 변수에 대한 정보가 표시됩니다.
- 명령문을 실행하려면 Step over를 다시 누르십시오 cout. (2019년 3월 릴리스부터 C++ 확장은 루프가 종료될 때까지 디버그 콘솔 에 출력을 인쇄하지 않습니다.)
- 원하는 경우 벡터의 모든 단어가 콘솔에 인쇄될 때까지 Step over를 계속 누를 수 있습니다. 하지만 궁금하다면 한 단계씩 들어가기 버튼을 눌러 C++ 표준 라이브러리의 소스 코드를 한 단계씩 살펴보십시오!자신의 코드로 돌아가려면 한 가지 방법은 Step over 를 계속 누르는 것입니다 . 또 다른 방법은 코드 편집기에서 탭으로 전환하고 루프 내부 명령문의 helloworld.cpp어딘가에 삽입 지점을 놓고 F9를 눌러 코드에 중단점을 설정하는 것입니다 . 왼쪽 여백에 빨간색 점이 나타나 이 줄에 중단점이 설정되었음을 나타냅니다.cout그런 다음 F5를 눌러 표준 라이브러리 헤더의 현재 줄에서 실행을 시작합니다. 실행이 중단됩니다 cout. 원하는 경우 F9를 다시 눌러 중단점을 해제할 수 있습니다.
- 루프가 완료되면 GDB에서 출력되는 다른 진단 정보와 함께 통합 터미널에서 출력을 볼 수 있습니다.
Watch 설정[Set a watch]
때때로 프로그램이 실행될 때 변수 값을 추적하고 싶을 수 있습니다. 변수에 감시를 설정하여 이를 수행할 수 있습니다 .
- 루프 안에 삽입점을 놓습니다. 조사 식 창 에서 더하기 기호를 클릭하고 텍스트 상자에 word루프 변수의 이름인 를 입력합니다. 이제 루프를 통과하면서 조사식 창을 봅니다.
- 루프 앞에 다음 명령문을 추가하여 다른 시계를 추가하십시오. int i = 0;. 그런 다음 루프 내부에 다음 문을 추가합니다. ++i;. i이제 이전 단계에서 했던 것처럼 시계를 추가합니다 .
- 중단점에서 실행이 일시 중지된 동안 변수 값을 빠르게 보려면 마우스 포인터를 해당 변수 위로 가져가면 됩니다.
launch.json으로 디버깅 사용자 지정[Customize debugging with launch.json]
재생 버튼 또는 F5 로 디버그하면 C++ 확장이 동적 디버그 구성을 즉석에서 생성합니다.
런타임 시 프로그램에 전달할 인수를 지정하는 것과 같이 디버그 구성을 사용자 지정하려는 경우가 있습니다. 파일 에서 사용자 지정 디버그 구성을 정의할 수 있습니다 launch.json.
를 생성하려면 재생 버튼 드롭다운 메뉴에서 디버그 구성 추가를launch.json 선택합니다 .
그러면 미리 정의된 다양한 디버깅 구성에 대한 드롭다운이 표시됩니다. C/C++ 선택 : g++.exe 빌드 및 디버그 활성 파일 .
VS Code는 launch.json다음과 같은 파일을 생성합니다.
{
"version": "0.2.0",
"configurations": [
{
"name": "C/C++: g++.exe build and debug active file",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}\\${fileBasenameNoExtension}.exe",
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerPath": "C:\\msys64\\mingw64\\bin\\gdb.exe",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "C/C++: g++.exe build active file"
}
]
}
위의 JSON에서 program디버그하려는 프로그램을 지정합니다. ${fileDirname}여기에서는 활성 파일 폴더( )와 .exe확장자( )가 있는 활성 파일 이름 으로 설정되며 ${fileBasenameNoExtension}.exe, helloworld.cpp활성 파일은 helloworld.exe. 속성 args은 런타임에 프로그램에 전달할 인수의 배열입니다.
기본적으로 C++ 확장은 소스 코드에 중단점을 추가하지 않으며 값 stopAtEntry은 false.
디버깅을 시작할 때 디버거가 메서드에서 중지되도록 하려면 stopAtEntry값을 로 변경합니다 .truemain
이제부터는 디버깅을 위해 프로그램을 시작할 때 재생 버튼과 F5 키가 파일 에서 읽습니다 .launch.json
C/C++ 구성[C/C++ configurations]
C/C++ 확장에 대해 더 많은 제어를 원하는 경우 c_cpp_properties.json컴파일러 경로, 포함 경로, C++ 표준(기본값은 C++17) 등과 같은 설정을 변경할 수 있는 파일을 만들 수 있습니다.
명령 팔레트( Ctrl+Shift+P ) 에서 C/C++: 구성 편집(UI) 명령을 실행하여 C/C++ 구성 UI를 볼 수 있습니다 .
그러면 C/C++ 구성 페이지가 열립니다. 여기에서 변경하면 VS Code는 해당 변경 사항을 폴더 c_cpp_properties.json에 있는 파일에 기록합니다 .vscode.
여기에서는 구성 이름을 GCC 로 변경하고 컴파일러 경로 드롭다운을 g++ 컴파일러로 설정 하고 IntelliSense 모드를 컴파일러( gcc-x64 )와 일치하도록 설정했습니다.
Visual Studio Code는 이러한 설정을 .vscode\c_cpp_properties.json. 해당 파일을 직접 열면 다음과 같이 표시됩니다.
{
"configurations": [
{
"name": "GCC",
"includePath": ["${workspaceFolder}/**"],
"defines": ["_DEBUG", "UNICODE", "_UNICODE"],
"windowsSdkVersion": "10.0.18362.0",
"compilerPath": "C:/msys64/mingw64/bin/g++.exe",
"cStandard": "c17",
"cppStandard": "c++17",
"intelliSenseMode": "windows-gcc-x64"
}
],
"version": 4
}
작업 영역이나 표준 라이브러리 경로에 없는 헤더 파일이 프로그램에 포함된 경우 에만 경로 배열 포함 설정 에 추가해야 합니다 .
컴파일러 경로[Compiler path]
확장은 compilerPath설정을 사용하여 C++ 표준 라이브러리 헤더 파일의 경로를 유추합니다. 확장 프로그램이 해당 파일을 찾을 위치를 알고 있으면 스마트 완성 및 Go to Definition 탐색과 같은 기능을 제공할 수 있습니다.
C/C++ 확장은 compilerPath시스템에서 찾은 항목을 기반으로 기본 컴파일러 위치로 채우려고 시도합니다. 확장은 여러 공통 컴파일러 위치에서 찾습니다.
검색 compilerPath순서는 다음과 같습니다.
- 먼저 Microsoft Visual C++ 컴파일러를 확인하십시오.
- 그런 다음 WSL(Linux용 Windows 하위 시스템)에서 g++를 찾습니다.
- 그런 다음 Mingw-w64용 g++.
compilerPathVisual Studio 또는 WSL이 설치되어 있는 경우 프로젝트에 대해 선호하는 컴파일러와 일치하도록 변경해야 할 수 있습니다 . 예를 들어 i686 아키텍처, Win32 스레딩 및 sjlj 예외 처리 설치 옵션을 사용하여 Mingw-w64 버전 8.1.0을 설치한 경우 경로는 다음과 같습니다 C:\Program Files (x86)\mingw-w64\i686-8.1.0-win32-sjlj-rt_v6-rev0\mingw64\bin\g++.exe.
문제 해결[Troubleshooting]
MSYS2가 설치되었지만 여전히 g++ 및 gdb를 찾을 수 없습니다.[MSYS2 is installed, but g++ and gdb are still not found]
MSYS2 웹사이트 의 단계를 따르고 MSYS CLI를 사용하여 해당 도구가 포함된 Mingw-w64를 설치해야 합니다. pacman -S --needed base-devel mingw-w64-x86_64-toolchain또한 디버거를 얻으려면 전체 Mingw-w64 도구 체인( )을 설치해야 합니다 gdb.
MinGW 32비트[MinGW 32-bit]
32비트 버전의 MinGW 도구 세트가 필요한 경우 MSYS2 wiki의 다운로드 섹션을 참조하십시오. 여기에는 32비트 및 64비트 설치 옵션에 대한 링크가 포함되어 있습니다
'Language Tips' 카테고리의 다른 글
Visual Studio Code 한글 인식 문제 (0) | 2023.03.26 |
---|---|
【C/C++환경설정】Visual Studio Code에서 C/C++ 코딩 환경 구축하기[Configure Visual Studio Code for C/C++] (0) | 2023.03.25 |
댓글