본문 바로가기
Programming/IDE

VSCode에서 C++ 사용하기 (Mac)

by peter paak 2020. 9. 14.
728x90

맥을 사용하는 입장에서 C++를 사용할 마땅한 IDE가 없다는 것이 조금 아쉬웠는데요. 이번에 VSCode의 extension을 사용하여 C++를 사용해보겠습니다. 특히 terminal에서 값을 입력받는 부분이 구글에 많이 보이지 않아서 공유해보려고 합니다.

해당 글에 사용된 소스코드는 github에서 보실 수 있습니다.

0. 준비

C++ 프로그래밍을 VSCode에서 하기 위해서는 두가지 extension이 필요합니다.

  1. Code Runner
  2. C/C++
    사실 C++을 실행시키기 위해서는 Code Runner만 있으면 됩니다. 하지만 Intellisense나 compile 오류 찾기, 디버깅 등 실행 외 부가적인 기능을 C/C++ extension이 제공해주게 됩니다.

1. 환경설정

먼저 c/c++ extension을 설치하도록 합니다. command + shift + x를 눌러서 c++를 검색하여 설치합니다.

2. 컴파일

다음은 hello.cpp 파일을 만들고 g++ 컴파일러로 컴파일합니다. 맥은 기본적으로 g++ 컴파일러를 가지고 있습니다. g++ -v으로 버전을 확인해보기시 바랍니다.

먼저 샘플파일을 만들어보겠습니다. 아래와 같이 hello.cpp라는 파일을 생성합니다.

#include <iostream>

using namespace std;

int main(int argc, char const *argv[])
{
    cout << "input numbers" << endl;
    int x;
    cin >> x;
    cout << "hello : " << x << endl;
    return 0;
}

해당 샘플은 간단하게 숫자를 입력받아 메세지를 출력하는 기본적인 테스트입니다.

이제 화면 상단에 terminal -> configure task를 클릭합니다.

클릭하면 각 컴파일러에 대한 설정파일을 작성할 수 있습니다. 저희는 가장 기본적인 설정에서 부터 작성할 것이기 때문에 제일 마지막 탭을 선택합니다.

여러가지 템플릿이 제공되는데 그중에서 가장 마지막의 기본 템플릿을 선택하도록 합니다.

그러면 아래처럼 .vscode/tasks.json이라는 설정 파일이 생성됩니다. vscode에서 사용할 수 있는 task 설정파일이며 파일을 build하거나 vscode에서 외부의 콘솔 명령어를 사용할 때 사용됩니다. 이제 해당 내용을 변경해주도록 하겠습니다.

tasks.json의 내용을 아래와 같이 변경합니다.

{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "build",
            "type": "shell",
            "command": "g++ -g hello.cpp -o hello",
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "problemMatcher": "$gcc"
        }
    ]
}

각 내용에 대해서 간단히 설명하자면 다음과 같습니다.

  • label : 콘솔창에 보여질 task의 이름입니다.
  • command : 실제 명령어를 실행하는 공간입니다. 저희는 g++ 컴파일러로 컴파일 할 것이기 때문에 해당 명령어를 작성합니다.
    • -g : 디버깅에 필요하는 정보를 생성하는 옵션입니다. 디버깅을 위해 꼭 추가하도록 합니다.
    • hello.cpp : 컴파일을 할 대상 파일입니다.
    • -o : output 파일을 작성하는 옵션입니다.
    • hello : output 파일을 이름을 설정합니다.
  • group : group을 여러 파일에 대한 설정값을 적용합니다. 특히, isDefault가 true면 컴파일할 것인지 묻지 않고 자동 컴파일 해줍니다.
  • problemMatcher : 간단히 regex 옵션입니다. 컴파일 에러가 발생할 때 vsocde에게 오류 내용을 regex를 사용하여 보내줍니다. 그러면 하단의 PROBLEMS 탭에서 오류 내용을 확인 할 수 있습니다.

이제 실제로 컴파일을 해보도록 하겠습니다.
hello.cpp 파일로 돌아가서 컴파일 명령어를 실행합니다. 저는 간단하게 단축키를 사용하도록 하겠습니다.

command + shift + b

그러면 아래와 같이 hello.cpp 파일 옆에 hello가 장 컴파일 되었음을 확인 할 수 있습니다.

컴파일된 파일을 실행하려면 터미널에서 실행시켜주면 됩니다.

./hello

그럼 아래와 같이 터미널에서 입력값을 받아 잘 실행함을 알 수 있습니다.

3. 디버깅

사실 디버깅 때문에 이 글을 작성하게 되었습니다. vscode는 디버깅 시, 내부 터미널로 입력값을 받을 수 없게 되어있습니다. 그래서 외부 즉, 맥의 터미널을 통해서 입력값을 받아야 합니다. 자세한 내용은 C++Now 2018: Rong Lu “C++ Development with Visual Studio Code” 이 곳을 참고해주시기 바랍니다.

그럼 디버깅 설정을 먼저 해보겠습니다.
먼저 디버깅 포인트를 체크를하고 디버깅 탭으로 이동합니다.

command + shift + d

그리고 Run and Debug를 클릭하며 다음과 같은 탭이 나옵니다.
mac은 xcode를 설치하면 lldb를 사용할 수 있습니다. 먼저 첫번째 탭을 클릭합니다.

vscode에서 여려가지 템플릿을 제공해주는데 저희는 기본설정을 사용해 보겠습니다.

그러면 vscode/launch.json이라는 디버깅 설정파일이 생성되게 됩니다. 많은 내용이 있지만 그중에서 두가지만 바꾸면 됩니다. 바로 programexternalConsole입니다.

설정파일을 아래처럼 바꿔줍니다.

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(lldb) 시작",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/hello", // 변경
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": true,               // 변경                    
            "MIMode": "lldb"
        }
    ]
}

간단히 설명해보면 다음과 같습니다.

  • program : 컴파일된 파일 경로
  • externalConsole : 외부 콘솔을 허용 유무를 설정합니다. 꼭 true로 변경해주셔야 디버깅 시, 맥 터미널이 실행됩니다.

이제 다시 hello.cpp로 돌아가 디버깅을 합니다.
그러면 아래와 같이 맥의 터미널이 시작되면서 작업중인 cpp 파일이 터미널에서 실행됩니다.
여기까지 별 문제없이 성공하셨다면 축하드립니다.

4. 터미널이 열리지 않는 경우

저의 경우는 터미널이 열리지 않았었는데요. github의 vscode-cpptools프로젝트에서 비슷한 내용의 issue를 찾을 수 있었습니다.

요약하면 VSCode가 debug adapter를 실행시키고 debug adapter는 lldb-mi를 실행하고 마지막으로 lldb-mi가 터미널을 실행 시킨다고 합니다. 하지만 permission의 이유에서 vscode가 터미널 명령까지 가지 못하는 상대입니다. task.json 에서 terminal을 실행시키는 task를 직접 실행하여 vscode에서 terminal을 실행하는 permission을 수동으로 허용하도록 합니다. 한번 실행시키고 나면 vscode가 permission을 인지하고 다음부터는 디버깅에서 terminal을 사용할 수 있습니다.

tasks.json

{
    "label": "Open Terminal",
    "type": "shell",
    "command": "osascript -e 'tell application \"Terminal\"\ndo script \"echo hello\"\nend tell'",
    "problemMatcher": []
}

위의 내용은 간단히 터미널을 실행시켜 hello라는 echo를 날리는 task입니다. 해당 테스크를 실행해보도록 하겠습니다. 아래 단축키를 실행합니다.

command + shift + p

Task: Run Task를 선택합니다.

Open Terminal을 선택합니다.

permission 허용여부를 묻는데 허용을 해줍니다. (저는 이미 허용해서 팝업이 나오지 않습니다.)
그러면 아래와 같이 터미널에 hello를 간단히 실행합니다. 이제 vscode에서 terminal을 허용했으므로 디버깅을 시작하면 terminal이 자동으로 실행되게 됩니다.

아래와 같이 잘 나온다면 성공한 것입니다.

정리

맥에서 vscode를 사용하여 c++를 사용하는 법에 대해 알아보았습니다. 개인적으로 마지막 부분에서 시간을 많이 낭비해서 해당 내용으로 시간 낭비하지 않으시길 바랍니다. 그리고 위의 내용은 매우 기본적인 설정이기 때문에 컴파일을 하고 파일을 실행하고 디버깅을 하는 과정을 수동으로 해줘야 합니다. tasks.json에서 vscode가 제공하는 환경변수들을 이용하면 컴파일부터 실행까지 한번에 하실 수 있을 것입니다. 기본 동작을 이해하셨으니 해당 내용을 인터넷에서 찾아보시면 쉽게 이해 되실 것이라 생각합니다.

728x90