잡다한 시리즈/Visual Studio Code

VSCode 설정 - (3) C/C++ 빌드 및 실행 설정하기

GGOBOOGI 2021. 4. 23. 02:49
반응형

예전 티스토리에 있던 글을 옮기다가 갑자기 기록해놓고 싶은 커스텀이 생각나서 적어본다.

> 그렇게 옛날 티스토리의 글을 열심히 벨로그로 옮기던 나는 다시 티스토리로 회귀하여 벨로그의 글을 가져오고 있음..

 

VSCode에서는 tasks.json 을 어떻게 설정하냐에 따라 사용법이 굉장히 달라지는데, 열심히 삽질을 하며 얻어낸 만족스러운 C/C++ 대상 tasks.json 사용법을 공유하려고 한다.

 


사건의 발단

일단 이 글을 쓰는 시점에서는 기록이 남아있지 않아 아쉽지만, 지금 이 설정을 갖기 전에는 C/C++ 파일을 빌드하고 실행할 때 터미널에 쓸데없이 굉장히 긴 커맨드가 자동으로 들어가서 터미널이 더러워지는게 꼴 보기 싫었다.

 

사실 그냥 내가 구글링해서 tasks.json 복붙해서 그런 참사가 일어나긴 했다만 ^^...

 

아무튼 분명히 알기로는 .c 파일이나 .cpp 파일을 컴파일 할 때는 'gcc 어쩌구저쩌구' 아니면 'g++ 어쩌구저쩌구' 커맨드만 들어갈 텐데, 쓸데없이 뭐하러 저렇게 긴 커맨드가 들어가서 나의 소중한 터미널을 더럽게 하는가.. 라는 쓸데없는 생각에서 시작된 뻘짓이었다.

 

결론적으로는 아래의 깔끔한 세 가지 명령어를 'ctrl + shift + b' 와 'ctrl + shift + t' 를 이용하여 터미널 상에서 깔끔하게 수행하도록 만들었다.

// .c 컴파일해서 실행파일 만들기
gcc -g ${file} -o ${fileDirname}\${fileBasenameNoExtension}.exe 

// .cpp 컴파일해서 실행파일 만들기
g++ -g ${file} -o ${fileDirname}\${fileBasenameNoExtension}.exe 

// .exe 실행파일 실행하기
${fileDirname}\${fileBasenameNoExtension}.exe

 만족스러운 깔끔한 터미널 현황이다.

이 밑으로는 그 과정을 기록한 이야기이다.


gcc g++ 컴파일 명령어 알아보기

VSCode에서 특정 파일을 빌드하고 돌려보는 것은 다음과 같다.

 

예를 들어, 사용자가 '야 이것좀 빌드해줘!' 라고 했을 때, VSCode에서는 그걸 받아서 사용자의 단축키에 걸려 있는 명령어를 VSCode와 연결된 터미널에 쏴 주는 것 밖에 없다.

 

그럼 당연히 일은 누가 하는가? VSCode? ㄴㄴ 터미널 ㅇㅇ.

VSCode는 단순히 편집기 그 이상도 그 이하도 아니기 때문에, 터미널 없이는 컴파일이고 나발이고 못한다.

 

따라서, gcc와 g++ 컴파일 명령어를 알아보고 내가 원하는 대로 명령어를 짜서 VSCode에 알려주기만 하면 된다.

 

그렇다면, gcc, g++ 명령어는 어떻게 사용하고, 옵션에는 무엇이 있는지부터 알아보자.


gcc와 g++의 차이

찾아보기 전에는 뇌피셜로 gcc 는 .c 컴파일 해주는거고, g++ 은 .cpp 컴파일 해 주는거 아닌가? 했는데 반은 맞고 반은 틀렸다.

 

GCC

엥 대문자로 잘못 쓰셨는데요? ㄴㄴ

 

GCC는 GNU 컴파일러 모음 (GNU Compiler Collection) 을 줄여서 말한 것이다.

 

GNU 프로젝트의 일환으로 개발되어 널리 쓰이고 있는 컴파일러이다.

 

원래 GCC는 C언어만을 지원하던 컴파일러였다. 따라서, 그때 당시에는 이름도 'GNU C 컴파일러' 였다.

 

하지만, C++, JAVA, Fortran, Ada 등의 여러 언어를 컴파일할 수 있게 되면서 'GNU 컴파일러 모음 (GCC)' 이라는 이름을 가지게 되었다.

 

gcc

소문자 대소문자 차이 아니냐? 라고 하기에는 아니라고 말하기도 뭐하고 그렇다고 말하기도 뭐하다.

 

앞에서 GCC 가 여러 언어들을 지원하는 GNU 컴파일러 모음이라고 했는데, 여기서 지원하는 언어들 중에서 C언어에 대한 컴파일러를 gcc 라고 하는 것이다.

 

그런데 애초에 초기 GCC 자체가 C언어만을 대상으로 한 컴파일러였기 때문에, 거의 뭐 동일시해서 부르는 듯한 느낌도 있다.

 

g++

gcc와 마찬가지로, GCC의 여러 컴파일러 중 C++ 언어에 대한 컴파일러를 g++ 이라고 한다.


gcc와 g++의 차이점

gcc g++
.c 파일과 .cpp 파일을 각각 C언어와 C++ 언어로 컴파일 .c와 .cpp 모두 C++ 언어로 컴파일
C 라이브러리와 링크됨 C++ 라이브러리와 링크됨
미리 정의된 매크로가 거의 없음 몇 가지 추가 매크로가 존재함

위와 같은 차이점 때문에, c++ 언어로 작성된 .cpp 파일에서 C++ 라이브러리를 사용하고 gcc 로 컴파일 할 경우 컴파일 된 파일을 c 라이브러리와 링크하기 때문에 링크 에러가 발생할 수 있다.

 

따라서, 나는 .c는 gcc 로, .cpp은 g++ 로 컴파일하기로 했다.


gcc 와 g++ 명령어

gcc 나 g++ 모두 사용법이 유사하므로 gcc 만을 다루어 설명하겠다.

 

1. gcc 기본 명령어

gcc test.c

이 명령어를 실행하면 명령어를 실행한 디렉토리 안에 실행파일인 a.exe 가 생성된다. (macOS 기준으로는 a.out )

 

물론, 실행파일이 생기긴 하는데 이름이 a.exe 로 고정이 되므로 생성 파일의 이름을 보기 좋게 바꿔 주도록 하자.

 

2. -o 옵션

gcc test.c -o test.exe

바이너리 형식의 출력 파일을 지정하는 옵션이다.

이 옵션을 사용해서 지정하지 않으면 기본 명령어의 결과와 같이 a라는 이름의 실행파일이 생성될 것이다.

 

위의 명령어를 이용하면 test.c를 컴파일한 결과물인 실행파일이 test.exe 라는 이름으로 생성된다.

 

3. -g 옵션

 

바이너리 파일에 표준 디버깅 정보를 포함시키는 옵션이다.

 

사실 이 옵션은 이전에 c/c++ 컴파일 설정을 하면서 어떤 분의 tasks.json을 베껴왔을 때 그 분이 이 옵션을 사용하셨길래 나도 계속 사용하고 있긴 한데.. 잘 모르겠다.


vscode 설정하기

task 구성 계획 세우기

보통 컴파일과 컴파일된 실행파일을 실행하는 두 과정이 동시에 이루어지도록 하는 단축키가 많지만, 나는 컴파일과 실행파일 실행 명령어를 따로 둘 것이다.

 

별다른 이유는 없고 컴파일 실패하면 빨리 고치게..

 

고로, 내가 만들어야 할 task와 그에 대한 명령어는 는 총 3가지이다.

 

1. .c 컴파일 해서 해당 파일명과 이름이 같은 .exe 만들기

gcc -g ${file} -o ${fileDirname}\${fileBasenameNoExtension}.exe

2. .cpp 컴파일 해서 해당 파일명과 이름이 같은 .exe 만들기

g++ -g ${file} -o ${fileDirname}\${fileBasenameNoExtension}.exe

3. 현재 명령어를 실행하는 .c나 .cpp 파일과 파일명이 같은 .exe 파일 실행하기

${fileDirname}\${fileBasenameNoExtension}.exe

 

여기서 사용한 ${어쩌구저쩌구}는 vscode에서 지원하는 매크로(?)이다.

각각 다음의 뜻을 가지고 있다.

${file} 현재 vscode에서 포커싱되어있는 파일의 전체 경로를 내뱉어줌
${fileDirname} 현재 vscode에서 포커싱되어있는 파일이 들어있는 디렉터리의 경로를 내뱉어줌
${fileBasenameNoExtension} 현재 vscode에서 포커싱되어있는 파일의 이름만을 내뱉어줌(확장자는 제외)

만약, 내가 test.cpp 파일을 열심히 만들고 실행을 해 보려고 하면

그 파일을 편집기 상에서 열어두고 2번 task를 실행해서 컴파일을 한 다음 3번 task를 실행하면 된다.


tasks.json 파일 만들기

tasks.json 파일이 무엇인가 하면, 작업을 할 때 필요한 여러가지 작업에 대한 명령어들을 미리 정의해 두고 필요한 task를 실행시키면 미리 정의된 명령어들이 실행될 수 있도록 하는 파일이다.

 

tasks.json을 만드는 방법은 두 가지이다.

 

1. 명령 팔레트 이용하기

 

F1 을 누르고 task 를 입력하면 다음과 같은 창이 뜬다.

위에 3개중에 아무거나 클릭해도 쟤네는 tasks.json이 필요한 애들이라 tasks.json이 없다면 아래와 같이 명령 팔레트가 실행할 작업이 없다고 징징댈 것이다.

친절히 안내해 주는 빌드 작업 구성을 클릭하면

이렇게 템플릿으로 만들어 준다고 한다.

 

클릭하게 되면 여러가지 템플릿들을 소개해 주는데 우리는 위의 세가지 다 아니니 others 로 간다.

그렇게 되면 작업 폴더에 .vscode 폴더가 생성되고 tasks.json 파일이 생성될 것이다.

기본 tasks.json 구성은 다음과 같다.

{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "label": "echo",
            "type": "shell",
            "command": "echo Hello"
        }
    ]
}

 

2. 직접 만들기

 

이 파일은 작업 폴더 내에 .vscode 라는 폴더를 만들고 tasks.json 이라는 파일을 직접 추가하여 만들 수 있다.

 

이렇게 될 경우 템플릿이 존재하지 않기 때문에 위에 있는 기본 tasks.json 구성을 참고하여 만들어야 한다.


tasks.json 설정하기

이제 task들을 만들어 보자.

 

1. .c 컴파일 해서 해당 파일명과 이름이 같은 .exe 만들기

 

{
            "type": "shell",
            "label": "gcc.exe build active file",
            "command": "gcc",
            "args": [
                "-g",
                "${file}",
                "-o",
                "${fileDirname}\\${fileBasenameNoExtension}.exe"
            ],
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            }
}
type 해당 작업을 프로세스로 진행할 것인지(process),
vscode 내의 셸에서 진행할 것인지(shell)를 정함.

나는 vscode 내부 셸을 cmd랑 연결해 놓아서 shell을 사용하였다.
label 해당 작업을 알아볼 수 있도록 이름을 붙여 주는 것
command 명령어의 맨 첫 명령어.. 라고 하면 이상하지만 args를 제외한 순수한 명령어를 의미함
args 명령어에 필요한 옵션이나 매개변수들
problemMatcher 컴파일하면서 나는 에러를 볼 수 있도록 함.

사용할 수 있는 값은 정해져 있기 때문에, g++이어도 gcc를 사용하면 된다.

Valid values: "$msCompile", "$lessCompile", "$gulp-tsc", "$jshint", "$jshint-stylish", "$eslint-compact", "$eslint-stylish", "$go", "$lessc", "$node-sass", "$tsc", "$tsc-watch", "$gcc", "$vsls".
group 작업을 특정 그룹에 속하도록 한다.
그룹은 build, test, none으로 정해져 있다.

isDefault 속성은 기본 작업 그룹에 해당 task가 속하도록 할 것인지를 물어보는 것이다.

 

 

2. .cpp 컴파일 해서 해당 파일명과 이름이 같은 .exe 만들기

 

{
            "type": "shell",
            "label": "g++.exe build active file",
            "command": "g++",
            "args": [
                "-g",
                "${file}",
                "-o",
                "${fileDirname}\\${fileBasenameNoExtension}.exe"
            ],
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            }
}

 

3. 현재 명령어를 실행하는 .c나 .cpp 파일과 파일명이 같은 .exe 파일 실행하기

{
            "type": "shell",
            "label": "Run",
            "command": "${fileDirname}\\${fileBasenameNoExtension}.exe",
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "test",
                "isDefault": true
            }
}

실행파일을 실행하는 명령어이므로 test 그룹에 들어가도록 했다.


키보드 단축키 설정하기

tasks.json 을 구성할 때, group 지정을 했다.

 

그룹별로 단축키를 실행할 수 있는데, 기본 단축키는 다음과 같다.

 

build 그룹

tasks.json을 저장한 상태에서 'ctrl + shift + b' 를 누르면 다음과 같이 우리가 구성한 빌드 작업들이 뜰 것이다.

.cpp 파일을 빌드하고 싶으면 해당 파일을 연 상태에서 'ctrl + shift + b' 를 누르고, 'g++ build active file' 을 선택하면 된다.

.c 파일을 빌드하고 싶으면 똑같은 방법으로 진행해서 'gcc build active file' 을 선택하면 된다.

 

여기서 나오는 'g++ build active file' 이건 우리가 아까 앞에서 설정한 task들의 label임을 알 수 있다.

 

test 그룹

test 그룹은 기본 키보드 단축키가 설정되어 있지 않으므로, 같이 설정해 보자.

 

바로 가기 키를 설정하기 위해 ' 파일 > 기본 설정 > 바로 가기 키 ' 를 선택한다.

그럼 이런 창이 나올텐데, 검색창에서 테스트를 검색한다.

나는 이미 테스트 작업 실행에 키를 바인딩해놔서 키 바인딩이 존재하는데, 기본적으로는 여기에 바인딩 된 키가 없으므로 옆의 연필 키를 눌러 바인딩을 진행하자.

연필 모양을 누르면 다음과 같은 화면이 뜨는데, 저 창이 뜬 순간부터 키보드 입력이 감지되므로 주의하도록 하자.

나는 'ctrl + shift + t' 키를 바인딩해 놓았다.

 

아래의 'shift + win + '은 캡쳐하다가 감지된 입력이니.. 무시하기 비람

 

원하는 키 바인딩을 넣고 엔터를 누르면 바인딩이 끝났다.


task를 통해 빌드 및 실행

이제 만들어 둔 tasks.json으로 빌드와 실행을 해 보자.

 

.c 파일을 빌드하고 실행할 경우, 해당 파일이 열려 있는 상태에서

1. 'ctrl + shift + b'를 눌러서 'gcc.exe build active file'을 선택한다.

2. 실행파일이 문제 없이 생성되었다면, 'ctrl + shift + t'를 눌러 해당 실행파일을 실행한다.

 

.cpp 파일을 빌드하고 실행할 경우, 해당 파일이 열려 있는 상태에서

1. 'ctrl + shift + b'를 눌러서 'g++.exe build active file'을 선택한다.

2. 실행파일이 문제 없이 생성되었다면, 'ctrl + shift + t'를 눌러 해당 실행파일을 실행한다.

 

한번 같이 해 보자.

 

test.cpp 파일을 아래의 내용으로 만들었다.

#include<iostream>
using namespace std;

int main()
{
    cout<<"hello world";
}

파일을 저장한 후, 'ctrl + shift + b'를 눌러 'g++.exe build active file'을 선택한다.

 

별 일이 없다면 vscode의 쉘 터미널에서 아래와 같은 깔끔한 명령어가 실행되고, 탐색기에는 test.exe 파일이 생성될 것이다.

지운 부분은 내 소중한 파일 경로이다.

 

별다른 에러가 뜨지 않으면 test.exe가 아주 잘 생성된 것이므로 'ctrl + shift + t'를 눌러 test.exe를 실행하도록 한다.

그럼 다음과 같이 결과가 아주 잘 나온다.


.exe 파일 vscode 탐색기에서 지우기

사실 이 방법은 다 좋은데, .exe 파일이 생성되어 남는다는 단점이 있다.

 

별거 아니긴 한데, 깔끔한 vscode 탐색기를 볼 때마다 마음이 아프다면, vscode 탐색기에서 .exe 파일이 보이지 않도록 할 수 있다.

 

'파일 > 기본 설정 > 설정' 에 들어가서 아래와 같이 files.exclude 를 검색한다.

밑의 사진처럼 사용자 영역과 작업 영역 부분이 나누어져 있는데, 사용자 영역 설정은 글로벌한 설정이고 작업 영역은 지금 이 vscode가 걸려 있는 이 작업 영역에 국한된 설정이다.

 

따라서, 이 작업 영역에만 적용되어야 하는 설정이라면 작업 영역 쪽에서 설정하면 된다.

 

모든 .exe 파일을 한보이게 하고 싶다면 **/*.exe 패턴을 추가하면 된다.

 

만약, 패턴 추가 버튼을 눌렀는데 .vscode/settings.json 파일이 생겼다면 files.exclude 부분에 "**/*.exe" : true 를 추가하면 된다.

 

더보기
반응형