컴파일, 디버깅, 빌드의 차이가 무엇일까?
VScode에서 C/C++환경을 구축하며 .c코드를 실행시켜보기 위해 삽질을 하면서 든 의문이다.
부끄럽지만 그동안 코드를 계속 쓰면서도 몰랐던 점이다. 디버깅에서 문제가 생겼다는데 빌드랑 다른 건가 싶고, 컴파일은 코드 돌리는 과정인가? 하는 정도의 느낌만 존재했다.
빌드(build)==컴파일(compile)+링크(link)
컴파일: 개발자들이 프로그래밍 언어로 만든 코드를 컴퓨터가 이해할 수 있는 기계어로 변환하는 과정.
즉, 컴파일은 "번역"이라고 할 수 있을 것 같다.
링크: 코드에는 개발자들이 직접 타이핑한 코드뿐만 아니라 라이브러리도 많은데, 이 라이브러리를 내 코드와 연결해주는 작업이 필요하다. 그 작업이 링크이다,
즉, 링크는 말 그대로 "연결"이라고 할 수 있을 것 같다.
빌드: 컴파일 및 링크, 즉 빌드를 해야 비로소 컴퓨터에서 실행할 수 있는 기계어 코드가 만들어지는 것.
즉, 나는 빌드를 "제출"이라고 이해했다.
디버깅(debugging): 코드에서 발생한 에러를 잡아내고, 수정하는 과정을 통칭하는 것.
즉, 디버깅은 "피드백" 이라고 할 수 있을 것 같다.
정리하고 나니 헷갈려서는 안 됐다는 생각이 들 정도로 다른 개념이다.. 당황스럽다.
앞으로는 모르면 바로바로 찾아서 정리하는 습관을 들여보자!
https://code.visualstudio.com/
추가 작업 선택 시,
'PATH에 추가'를 꼭 체크한다.
폴더를 하나 생성해 열고, 그 폴더 안에서 test.cpp를 생성하자
주의사항: 경로에 한글을 포함하면 안 된다. 나중에 path문제로 오류가 난다.
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
(1)컴파일러 Path 등록
(2)세 가지 파일 설정
컴파일러의 기본 위치를 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
를 입력하여 버전이 제대로 나오면 경로 설정이 제대로 된 것이다.
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 파일이 자동 생성된다.
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을 추가 설치해 실행을 진행할 것이다.
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
}
]
}
]
}
와 같이 채우면 된다.
Code Runner를 Extension창에서 설치한 후, VScode를 껐다 재실행한다(그래야 정상 동작 가능)
test.cpp코드에서 마우스 우클릭으로 'Run Code'를 선택하거나, Ctrl+Alt+N 단축키를 눌러서 코드 실행이 잘 되는지 확인하자.
디버깅 테스트는 F5키를 눌러서 오른쪽에 터미널로 실행 결과가 뜨고, 왼쪽에는 변수와 조사식이 뜬다면 제대로 디버깅이 이루어지는 것이다.
#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