이 출시되었습니다! 11월의 새로운 기능 및 수정 사항을 읽어보세요.

Visual Studio Code에서 Clang 사용하기

이 튜토리얼에서는 macOS에서 Visual Studio Code를 Clang/LLVM 컴파일러 및 디버거와 함께 사용하도록 구성합니다.

VS Code 구성을 마친 후 VS Code에서 C++ 프로그램을 컴파일하고 디버깅하게 됩니다. 이 튜토리얼은 Clang이나 C++ 언어에 대해 가르치지 않습니다. 이 주제들에 대한 좋은 자료는 웹에서 많이 찾을 수 있습니다.

문제가 발생하면 언제든지 VS Code 설명서 리포지토리에 이 튜토리얼에 대한 이슈를 제출해 주세요.

전제 조건

이 튜토리얼을 성공적으로 완료하려면 다음 단계를 수행해야 합니다.

  1. macOS에서 Visual Studio Code 설치.

  2. VS Code용 C++ 확장 프로그램 설치. 확장 보기(⇧⌘X (Windows, Linux Ctrl+Shift+X))에서 'C++'를 검색하여 C/C++ 확장 프로그램을 설치할 수 있습니다.

    C/C++ extension

Clang이 설치되었는지 확인

Mac에 Clang이 이미 설치되어 있을 수 있습니다. 이를 확인하려면 macOS 터미널 창을 열고 다음 명령을 입력하세요.

clang --version

Clang이 설치되어 있지 않다면, Clang을 포함하는 명령줄 개발자 도구를 설치하기 위해 다음 명령을 입력하세요.

xcode-select --install

Hello World 앱 만들기

macOS 터미널에서 VS Code 프로젝트를 저장할 빈 폴더를 `projects`라고 생성한 다음, `helloworld`라는 하위 폴더를 만들고 그 안으로 이동한 후, 터미널 창에 다음 명령을 입력하여 해당 폴더에서 VS Code를 엽니다.

mkdir projects
cd projects
mkdir helloworld
cd helloworld
code .

code . 명령은 현재 작업 중인 폴더에서 VS Code를 엽니다. 이 폴더는 "작업 영역"이 됩니다. 튜토리얼을 진행하는 동안 작업 영역의 `.vscode` 폴더에 세 개의 파일이 생성됩니다.

  • tasks.json (컴파일러 빌드 설정)
  • launch.json (디버거 설정)
  • c_cpp_properties.json (컴파일러 경로 및 IntelliSense 설정)

Hello World 소스 코드 파일 추가

파일 탐색기 제목 표시줄에서 새 파일 버튼을 선택하고 파일 이름을 helloworld.cpp로 지정합니다.

New File title bar button

다음 소스 코드를 붙여넣습니다.

#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;
}

이제 ⌘S (Windows, Linux Ctrl+S)를 눌러 파일을 저장합니다. VS Code 사이드바의 **파일 탐색기** 보기(⇧⌘E (Windows, Linux Ctrl+Shift+E))에 파일 목록이 표시되는 것을 확인하세요.

File Explorer

파일을 **파일** > **자동 저장**을 선택하여 **자동 저장** 기능을 활성화하여 파일 변경 사항을 자동으로 저장할 수도 있습니다. VS Code 사용자 인터페이스 설명서에서 다른 보기들에 대한 자세한 내용을 찾을 수 있습니다.

참고: C++ 파일을 저장하거나 열 때 C/C++ 확장에서 Insiders 버전을 사용할 수 있다는 알림이 표시될 수 있습니다. 이 버전은 새로운 기능과 수정을 테스트할 수 있습니다. X(알림 지우기)를 선택하여 이 알림을 무시할 수 있습니다.

IntelliSense 탐색

IntelliSense는 코드 완성, 매개변수 정보, 빠른 정보, 멤버 목록과 같은 코드 편집 기능을 추가하여 더 빠르고 효율적으로 코드를 작성하도록 돕는 도구입니다.

IntelliSense가 작동하는 것을 보려면 `vector` 또는 `string` 위에 마우스를 올려 타입 정보를 확인하세요. 10행에 `msg.`를 입력하면 IntelliSense에서 생성된 호출할 멤버 함수의 권장 목록을 볼 수 있습니다.

Statement completion IntelliSense

선택한 멤버를 삽입하려면 Tab 키를 누를 수 있습니다. 그런 다음 여는 괄호를 추가하면 함수에 필요한 인수에 대한 정보가 표시됩니다.

IntelliSense가 아직 구성되지 않은 경우, 명령 팔레트(⇧⌘P (Windows, Linux Ctrl+Shift+P))를 열고 **IntelliSense 구성 선택**을 입력합니다. 컴파일러 드롭다운 목록에서 `clang++ 사용`을 선택하여 구성합니다. 자세한 내용은 IntelliSense 구성 설명서에서 찾을 수 있습니다.

helloworld.cpp 실행

C++ 확장은 기계에 설치된 C++ 컴파일러를 사용하여 프로그램을 빌드한다는 점을 기억하세요. VS Code에서 `helloworld.cpp`를 실행하고 디버깅하기 전에 Clang과 같은 C++ 컴파일러가 설치되어 있는지 확인하세요.

  1. helloworld.cpp를 열어 활성 파일로 만듭니다.

  2. 편집기 오른쪽 상단에 있는 재생 버튼을 누릅니다.

    Screenshot of helloworld.cpp and play button

  3. 시스템에서 감지된 컴파일러 목록에서 **C/C++: clang++ 활성 파일 빌드 및 디버그**를 선택합니다.

    Build and debug task

`helloworld.cpp`를 처음 실행할 때만 컴파일러를 선택하라는 메시지가 표시됩니다. 이 컴파일러는 `tasks.json` 파일에 설정된 "기본" 컴파일러입니다.

  1. 빌드가 성공하면 프로그램의 출력이 통합 **디버그 콘솔**에 표시됩니다.

    screenshot of program output

축하합니다! VS Code에서 첫 C++ 프로그램을 실행했습니다!

tasks.json 이해하기

프로그램을 처음 실행할 때 C++ 확장은 프로젝트의 `.vscode` 폴더에 있는 `tasks.json`을 생성합니다. `tasks.json`은 빌드 구성을 저장합니다.

macOS의 `tasks.json` 파일 예시는 다음과 같습니다.

{
  "tasks": [
    {
      "type": "cppbuild",
      "label": "C/C++: clang++ build active file",
      "command": "/usr/bin/clang++",
      "args": [
        "-fcolor-diagnostics",
        "-fansi-escape-codes",
        "-g",
        "${file}",
        "-o",
        "${fileDirname}/${fileBasenameNoExtension}"
      ],
      "options": {
        "cwd": "${fileDirname}"
      },
      "problemMatcher": ["$gcc"],
      "group": {
        "kind": "build",
        "isDefault": true
      },
      "detail": "Task generated by Debugger."
    }
  ],
  "version": "2.0.0"
}

참고: tasks.json 변수에 대해 자세히 알아보려면 변수 참조를 참조하십시오.

command 설정은 실행할 프로그램을 지정합니다. 이 경우 `clang++`입니다.

args 배열은 clang++에 전달되는 명령줄 인수를 지정합니다. 이러한 인수는 컴파일러가 예상하는 순서대로 지정해야 합니다.

이 작업은 C++ 컴파일러에게 활성 파일(`"${file}"`)을 가져와 컴파일하고 현재 디렉토리(`"${fileDirname}"`)에 활성 파일과 이름은 같지만 파일 확장자는 없는 출력 파일(`-o` 스위치)을 생성하도록 지시합니다(`"${fileBasenameNoExtension}"`). 이 프로세스는 `helloworld`를 생성합니다.

label 값은 작업 목록에서 볼 수 있는 것으로, 개인 선호도에 따라 달라집니다.

detail 값은 작업 목록에서 작업에 대한 설명입니다. 유사한 작업과 구분하기 위해 이 문자열을 업데이트하세요.

problemMatcher 값은 컴파일러 출력에서 오류 및 경고를 찾는 데 사용할 출력 파서를 선택합니다. clang++의 경우 `$gcc` 문제 해결사(problem matcher)가 최상의 결과를 생성합니다.

이제부터 실행 버튼은 `tasks.json`에서 프로그램을 빌드하고 실행하는 방법을 읽어옵니다. `tasks.json`에 여러 빌드 작업을 정의할 수 있으며, 기본값으로 표시된 작업이 실행 버튼에서 사용됩니다. 기본 컴파일러를 변경해야 하는 경우 명령 팔레트에서 **작업: 기본 빌드 작업 구성**을 실행할 수 있습니다. 또는 `tasks.json` 파일을 수정하고 이 부분을 대체하여 기본값을 제거할 수 있습니다.

    "group": {
        "kind": "build",
        "isDefault": true
    },

이것으로

    "group": "build",

tasks.json 수정

"${file}" 대신 `"${workspaceFolder}/*.cpp"`와 같은 인수를 사용하여 `tasks.json`을 수정하여 여러 C++ 파일을 빌드할 수 있습니다. 이렇게 하면 현재 폴더의 모든 `.cpp` 파일이 빌드됩니다. `"${fileDirname}/${fileBasenameNoExtension}"`을 하드코딩된 파일 이름(예: `"${workspaceFolder}/myProgram.out"`)으로 바꿔서 출력 파일 이름도 수정할 수 있습니다.

helloworld.cpp 디버그

코드를 디버그하려면

  1. helloworld.cpp로 돌아가 활성 파일로 만듭니다.

  2. 편집기 여백을 클릭하거나 현재 줄에서 F9를 사용하여 중단점을 설정합니다.

    screenshot of breakpoint in helloworld.cpp

  3. 실행 버튼 옆의 드롭다운에서 **C/C++ 파일 디버그**를 선택합니다.

    Screenshot of play button drop-down

  4. 시스템에서 감지된 컴파일러 목록에서 **C/C++: clang++ 활성 파일 빌드 및 디버그**를 선택합니다 (`helloworld.cpp`를 처음 실행하거나 디버그할 때만 컴파일러를 선택하라는 메시지가 표시됩니다).

    Build and debug task

  5. 작업이 실행되고 **터미널** 창에 출력이 표시되는 것을 볼 수 있습니다.

    Hello World Terminal Output

실행 버튼에는 **C/C++ 파일 실행**과 **C/C++ 파일 디버그**의 두 가지 모드가 있습니다. 기본값은 마지막으로 사용된 모드입니다. 실행 버튼에 디버그 아이콘이 표시되면 드롭다운 메뉴 항목을 선택하는 대신 실행 버튼을 선택하여 디버깅할 수 있습니다.

디버거 탐색

코드를 단계별로 실행하기 전에 사용자 인터페이스의 몇 가지 변경 사항을 잠시 살펴보겠습니다.

  • 통합 터미널은 소스 코드 편집기 하단에 나타납니다. **디버그 콘솔** 탭에서 디버거가 실행 중임을 나타내는 출력이 표시됩니다.

  • 편집기는 디버거를 시작하기 전에 중단점을 설정한 줄을 강조 표시합니다.

    Initial breakpoint

  • 활동 표시줄의 **실행 및 디버그** 보기는 디버깅 정보를 보여줍니다.

  • 코드 편집기 상단에 디버깅 제어 패널이 나타납니다. 왼쪽의 점을 잡아서 화면 주위로 이동할 수 있습니다.

    Debugging controls

코드 단계별 실행

이제 코드를 단계별로 실행할 준비가 되었습니다.

  1. **한 단계씩 건너뛰기** 아이콘을 디버깅 제어판에서 선택하여 `for (const string& word : msg)` 문이 강조 표시되도록 합니다.

    Step over button

    **한 단계씩 건너뛰기** 명령은 `msg` 변수가 생성 및 초기화될 때 호출되는 `vector` 및 `string` 클래스의 모든 내부 함수 호출을 건너뜁니다. **변수** 창의 변경 사항을 확인하세요. 해당 문이 완료되었으므로 `msg`의 내용이 표시됩니다.

  2. **한 단계씩 건너뛰기**를 다시 누르면 다음 문으로 진행합니다 (루프 초기화에 실행되는 모든 내부 코드를 건너뜁니다). 이제 **변수** 창에 루프 변수에 대한 정보가 표시됩니다.

  3. **한 단계씩 건너뛰기**를 다시 눌러 `cout` 문을 실행합니다.

  4. 원하는 경우 **건너뛰기**를 계속 눌러 벡터의 모든 단어가 콘솔에 인쇄될 때까지 실행할 수 있습니다. 하지만 궁금하다면 **단계별 실행** 버튼을 눌러 C++ 표준 라이브러리의 소스 코드를 단계별로 실행해 보세요!

감시 설정

프로그램 실행 중에 변수의 값을 추적하고 싶을 수 있습니다. 변수에 **주시**를 설정하여 이를 수행할 수 있습니다.

  1. **주시** 창에서 더하기 기호를 선택하고 텍스트 상자에 `word`를 입력합니다. 이것이 루프 변수의 이름입니다. 이제 루프를 단계별로 실행하면서 **주시** 창을 확인합니다.

    Watch window

    **참고**: 프로그램 실행이 변수의 범위 내에 있을 때만 주시 변수의 값을 사용할 수 있습니다. 예를 들어, 루프 변수의 경우 프로그램이 루프를 실행하는 동안에만 값을 사용할 수 있습니다.

  2. 루프 앞에 다음 문을 추가하여 다른 감시를 추가합니다. int i = 0;. 그런 다음 루프 안에 다음 문을 추가합니다. ++i;. 이제 이전 단계에서 수행한 것처럼 i를 감시합니다.

  3. 실행이 일시 중지된 동안 마우스 포인터로 변수를 가리키면 해당 값을 빠르게 볼 수 있습니다.

    Mouse hover

launch.json으로 디버깅 사용자 지정

재생 버튼 또는 F5로 디버그할 때 C++ 확장은 즉석에서 동적 디버그 구성을 생성합니다.

런타임에 프로그램에 전달할 인수를 지정하는 것과 같이 디버그 구성을 사용자 지정하려는 경우가 있습니다. launch.json 파일에 사용자 지정 디버그 구성을 정의할 수 있습니다.

launch.json을 만들려면 재생 버튼 드롭다운 메뉴에서 디버그 구성 추가를 선택합니다.

Add debug configuration play button menu

그러면 다양한 사전 정의된 디버깅 구성에 대한 드롭다운이 표시됩니다. **C/C++: clang++ 활성 파일 빌드 및 디버그**를 선택합니다. C++ 디버그 구성 드롭다운

VS Code는 다음과 같은 launch.json 파일을 생성합니다.

{
  "configurations": [
    {
      "name": "C/C++: clang++ build and debug active file",
      "type": "cppdbg",
      "request": "launch",
      "program": "${fileDirname}/${fileBasenameNoExtension}",
      "args": [],
      "stopAtEntry": false,
      "cwd": "${fileDirname}",
      "environment": [],
      "externalConsole": false,
      "MIMode": "lldb",
      "preLaunchTask": "C/C++: clang++ build active file"
    }
  ],
  "version": "2.0.0"
}

program 설정은 디버깅하려는 프로그램을 지정합니다. 여기서는 활성 파일 폴더 `"${fileDirname}"`과 활성 파일 이름 `"${fileBasenameNoExtension}"`으로 설정되며, `helloworld.cpp`가 활성 파일이면 `helloworld`가 됩니다. args 속성은 런타임에 프로그램에 전달할 인수 배열입니다.

기본적으로 C++ 확장은 소스 코드에 어떤 중단점도 추가하지 않으며 stopAtEntry 값은 false로 설정됩니다.

디버깅을 시작할 때 main 메서드에서 중단되도록 stopAtEntry 값을 true로 변경합니다.

preLaunchTask 값이 `tasks.json` 파일의 빌드 작업 label과 일치하는지 확인합니다.

이제부터 재생 버튼 및 F5는 디버깅을 위해 프로그램을 시작할 때 launch.json 파일에서 읽어옵니다.

추가 C/C++ 설정 추가하기

C/C++ 확장을 더 자세히 제어하려면 `c_cpp_properties.json` 파일을 생성하여 컴파일러 경로, 포함 경로, 컴파일 기준 C++ 표준(예: C++17) 등과 같은 설정을 변경할 수 있습니다.

명령 팔레트(⇧⌘P (Windows, Linux Ctrl+Shift+P))에서 **C/C++: 구성 편집(UI)** 명령을 실행하여 C/C++ 구성 UI를 봅니다.

Command Palette

그러면 **C/C++ 구성** 페이지가 열립니다.

C++ configuration

Visual Studio Code는 이러한 설정을 .vscode/c_cpp_properties.json에 배치합니다. 해당 파일을 직접 열면 다음과 같은 모양이어야 합니다.

{
  "configurations": [
    {
      "name": "Mac",
      "includePath": ["${workspaceFolder}/**"],
      "defines": [],
      "macFrameworkPath": [
        "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks"
      ],
      "compilerPath": "/usr/bin/clang",
      "cStandard": "c11",
      "cppStandard": "c++17",
      "intelliSenseMode": "macos-clang-arm64"
    }
  ],
  "version": 4
}

프로그램이 작업 영역이나 표준 라이브러리 경로에 없는 헤더 파일을 포함하는 경우에만 **포함 경로** 설정을 수정해야 합니다.

컴파일러 경로

확장은 compilerPath 설정을 사용하여 C++ 표준 라이브러리 헤더 파일의 경로를 추론합니다. 확장이 해당 파일의 위치를 알면 스마트 완성 및 **정의로 이동** 탐색과 같은 기능을 제공할 수 있습니다.

C++ 확장은 시스템에서 발견된 것을 기반으로 기본 컴파일러 위치를 추론하기 위해 compilerPath를 채우려고 시도합니다. compilerPath 검색 순서는 다음과 같습니다.

  • 알려진 컴파일러 이름에 대한 PATH. 컴파일러가 목록에 나타나는 순서는 PATH에 따라 달라집니다.
  • 그런 다음 `'/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/'`과 같은 하드코딩된 Xcode 경로를 검색합니다.

자세한 내용은 IntelliSense 구성 설명서를 참조하세요.

Mac 프레임워크 경로

C/C++ 구성 화면에서 아래로 스크롤하여 **고급 설정**을 확장하고 **Mac 프레임워크 경로**가 시스템 헤더 파일을 가리키는지 확인합니다. 예를 들어: `'/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks'`

문제 해결

컴파일러 및 링커 오류

오류(예: `undefined _main` 또는 `attempting to link with file built for unknown-unsupported file format` 등)의 가장 일반적인 원인은 빌드를 시작하거나 디버깅을 시작할 때 `helloworld.cpp`가 활성 파일이 아닌 경우입니다. 이는 컴파일러가 `launch.json`, `tasks.json` 또는 `c_cpp_properties.json` 파일과 같은 소스 코드가 아닌 것을 컴파일하려고 시도하기 때문입니다.

"C++11 확장"을 언급하는 빌드 오류가 표시되면 `tasks.json` 빌드 작업을 clang++ 인수 `--std=c++17`을 사용하도록 업데이트하지 않았을 수 있습니다. 기본적으로 clang++은 `helloworld.cpp`에서 사용된 초기화를 지원하지 않는 C++98 표준을 사용합니다. `tasks.json` 파일의 전체 내용을 helloworld.cpp 실행 섹션에 제공된 코드 블록으로 바꾸십시오.

터미널이 입력용으로 시작되지 않음

`"externalConsole": true`를 설정한 후에도 macOS Catalina 이상에서는 입력을 할 수 없는 문제가 발생할 수 있습니다. 터미널 창이 열리지만 실제로는 아무것도 입력할 수 없습니다.

이 문제는 현재 #5079에서 추적 중입니다.

해결 방법은 VS Code가 터미널을 한 번 실행하도록 하는 것입니다. `tasks.json`에 이 작업을 추가하고 실행하여 수행할 수 있습니다.

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

이 특정 작업은 **터미널** > **작업 실행...**을 사용하여 실행하고 **터미널 열기**를 선택할 수 있습니다.

권한 요청을 수락하면 외부 콘솔이 디버깅 시 나타나야 합니다.

다음 단계

© . This site is unofficial and not affiliated with Microsoft.