Linux 上の VS Code で C++ を使用する

このチュートリアルでは、Linux 上で GCC C++ コンパイラ (g++) と GDB デバッガーを使用するように Visual Studio Code を構成します。GCC は GNU Compiler Collection の略です。GDB は GNU デバッガーです。

VS Code を構成したら、VS Code で簡単な C++ プログラムをコンパイルおよびデバッグします。このチュートリアルでは、GCC、GDB、Ubuntu、または C++ 言語については説明しません。これらのトピックについては、Web 上に多くの優れたリソースがあります。

問題が発生した場合は、VS Code ドキュメントリポジトリでこのチュートリアルの問題を遠慮なくファイルしてください。

前提条件

このチュートリアルを正常に完了するには、次のことを行う必要があります

  1. Visual Studio Code をインストールします。

  2. VS Code 用 C++ 拡張機能をインストールします。拡張機能ビュー (⇧⌘X (Windows、Linux Ctrl+Shift+X)) で「c++」を検索して、C/C++ 拡張機能をインストールできます。

    C/C++ extension

GCC がインストールされていることを確認する

VS Code を使用してソースコードを編集しますが、g++ コンパイラを使用して Linux 上でソースコードをコンパイルします。また、GDB を使用してデバッグも行います。これらのツールは Ubuntu には既定でインストールされていないため、インストールする必要があります。幸いなことに、それは簡単です。

まず、GCC が既にインストールされているかどうかを確認します。インストールされているかどうかを確認するには、ターミナルウィンドウを開き、次のコマンドを入力します

gcc -v

GCC がインストールされていない場合は、ターミナルウィンドウから次のコマンドを実行して、Ubuntu パッケージリストを更新します。古い Linux ディストリビューションは、新しいパッケージをインストールしようとするときに干渉する場合があります。

sudo apt-get update

次に、次のコマンドを使用して GNU コンパイラツールと GDB デバッガーをインストールします

sudo apt-get install build-essential gdb

Hello World の作成

ターミナルウィンドウから、VS Code プロジェクトを保存するための projects という名前の空のフォルダーを作成します。次に、helloworld という名前のサブフォルダーを作成し、そこに移動して、次のコマンドを入力してそのフォルダーで VS Code を開きます

mkdir projects
cd projects
mkdir helloworld
cd helloworld
code .

code . コマンドは、現在の作業フォルダーで VS Code を開き、それが "ワークスペース" になります。チュートリアルを進めるにつれて、ワークスペースの .vscode フォルダーに 3 つのファイルを作成します

  • 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;

    return 0;
}

次に、⌘S (Windows、Linux Ctrl+S) を押して、ファイルを保存します。ファイルが エクスプローラー ビュー (⇧⌘E (Windows、Linux Ctrl+Shift+E)) の VS Code のサイドバーにリストされていることに注意してください

File Explorer

メインの [ファイル] メニューで [自動保存] をオンにすると、自動保存を有効にして、ファイルの変更を自動的に保存することもできます。

Visual Studio Code のエッジにあるアクティビティバーを使用すると、[検索][ソース管理][実行とデバッグ] などのさまざまなビューを開くことができます。このチュートリアルの後半で [実行とデバッグ] ビューについて説明します。他のビューの詳細については、VS Code のユーザーインターフェースのドキュメントを参照してください。

: C++ ファイルを保存または開くと、新しい機能と修正をテストできる Insiders バージョンの可用性に関する C/C++ 拡張機能からの通知が表示される場合があります。X ([通知をクリア]) を選択して、この通知を無視できます。

IntelliSense を試す

helloworld.cpp ファイルで、vector または string の上にマウスカーソルを置くと、型情報が表示されます。msg 変数の宣言の後、メンバー関数を呼び出すときと同じように msg. の入力を開始します。メンバー関数をすべて表示する補完リストと、msg オブジェクトの型情報を表示するウィンドウがすぐに表示されます

Statement completion IntelliSense

Tab キーを押して、選択したメンバーを挿入できます。次に、開き括弧を追加すると、関数に必要な引数に関する情報が表示されます。

helloworld.cpp の実行

C++ 拡張機能は、マシンにインストールされている C++ コンパイラを使用してプログラムをビルドすることを忘れないでください。VS Code で helloworld.cpp を実行およびデバッグする前に、C++ コンパイラがインストールされていることを確認してください。

  1. helloworld.cpp を開いてアクティブなファイルにします。

  2. エディターの右上隅にある再生ボタンを押します。

    Screenshot of helloworld.cpp and play button

  3. システムで検出されたコンパイラのリストから [g++ ビルドとアクティブなファイルのデバッグ] を選択します。

    C++ debug configuration dropdown

helloworld.cpp を最初に実行するときにのみ、コンパイラを選択するように求められます。このコンパイラは、tasks.json ファイルで "既定" のコンパイラとして設定されます。

  1. ビルドが成功すると、プログラムの出力が統合 ターミナル に表示されます。

    screenshot of program output

プログラムを最初に実行するときに、C++ 拡張機能によって tasks.json が作成されます。これは、プロジェクトの .vscode フォルダーにあります。tasks.json には、ビルド構成が格納されます。

新しい tasks.json ファイルは、次の JSON と同様に見えるはずです

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

: tasks.json 変数の詳細については、変数のリファレンスを参照してください。

command 設定は、実行するプログラムを指定します。この場合は g++ です。args 配列は、g++ に渡されるコマンドライン引数を指定します。これらの引数は、コンパイラが予期する順序で指定する必要があります。

このタスクは、g++ にアクティブなファイル (${file}) を取得し、それをコンパイルして、現在のディレクトリ (${fileDirname}) に、拡張子なしでアクティブなファイルと同じ名前 (${fileBasenameNoExtension}) の実行可能ファイルを作成するように指示します。これにより、例では helloworld になります。

label 値は、タスクリストに表示されるものです。これは好きなように名前を付けることができます。

detail 値は、タスクリストのタスクの説明として表示されるものです。この値の名前を変更して、類似のタスクと区別することを強くお勧めします。

今後は、再生ボタンは tasks.json から読み取って、プログラムをビルドおよび実行する方法を把握します。tasks.json で複数のビルドタスクを定義でき、既定としてマークされているタスクが再生ボタンで使用されます。既定のコンパイラを変更する必要がある場合は、[タスク: 既定のビルドタスクの構成] を実行できます。または、tasks.json ファイルを変更して、次のセグメントを置き換えることで既定を削除できます

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

これで

    "group": "build",

tasks.json の変更

"${file}" の代わりに "${workspaceFolder}/*.cpp" のような引数を使用することで、複数の C++ ファイルをビルドするように tasks.json を変更できます。これにより、現在のフォルダー内のすべての .cpp ファイルがビルドされます。また、"${fileDirname}/${fileBasenameNoExtension}" をハードコーディングされたファイル名 (たとえば 'helloworld.out') に置き換えることで、出力ファイル名を変更することもできます。

helloworld.cpp のデバッグ

コードをデバッグするには、

  1. helloworld.cpp に戻ってアクティブなファイルにします。
  2. エディターの余白をクリックするか、現在の行で F9 キーを使用してブレークポイントを設定します。helloworld.cpp のブレークポイントのスクリーンショット
  3. 再生ボタンの横にあるドロップダウンから、[C/C++ ファイルのデバッグ] を選択します。再生ボタンのドロップダウンのスクリーンショット
  4. システムで検出されたコンパイラのリストから [C/C++: g++ ビルドとアクティブなファイルのデバッグ] を選択します (helloworld.cpp を最初に実行またはデバッグするときにのみ、コンパイラを選択するように求められます)。C++ デバッグ構成ドロップダウン

再生ボタンには、[C/C++ ファイルの実行] モードと [C/C++ ファイルのデバッグ] モードの 2 つのモードがあります。最後に使用したモードが既定になります。再生ボタンにデバッグアイコンが表示されている場合は、ドロップダウンメニュー項目を選択する代わりに、再生ボタンを選択してデバッグできます。

デバッガーを試す

コードのステップ実行を開始する前に、ユーザーインターフェースのいくつかの変更点に注目しましょう

  • 統合ターミナルがソースコードエディターの下部に表示されます。[デバッグ出力] タブに、デバッガーが起動して実行されていることを示す出力が表示されます。

  • エディターは、デバッガーを起動する前に設定したブレークポイントである 12 行目を強調表示します

    Initial breakpoint

  • 左側の [実行とデバッグ] ビューにデバッグ情報が表示されます。例はチュートリアルの後半で説明します。

  • コードエディターの上部に、デバッグコントロールパネルが表示されます。左側のドットをドラッグすると、画面上で移動できます。

    Debugging controls

ワークスペースに launch.json ファイルが既にある場合、再生ボタンは C++ ファイルの実行方法とデバッグ方法を判断するときにそれから読み取ります。launch.json がない場合、再生ボタンは一時的な "クイックデバッグ" 構成をその場で作成するため、launch.json はまったく必要ありません!

コードをステップ実行する

これで、コードのステップ実行を開始する準備ができました。

  1. デバッグコントロールパネルで [ステップオーバー] アイコンをクリックまたは押します。

    Step over button

    これにより、プログラムの実行が for ループの最初の行に進み、msg 変数が作成および初期化されるときに呼び出される vector クラスと string クラス内のすべての内部関数呼び出しをスキップします。サイドの [変数] ウィンドウの変化に注目してください。

    Debugging windows

  2. [ステップオーバー] をもう一度押して、このプログラムの次のステートメントに進みます (ループを初期化するために実行されるすべての内部コードをスキップします)。これで、[変数] ウィンドウにループ変数に関する情報が表示されます。

  3. [ステップオーバー] をもう一度押して、cout ステートメントを実行します。(C++ 拡張機能は、最後の cout が実行されるまで [デバッグコンソール] に出力を出力しないことに注意してください。)

  4. 必要に応じて、[ステップオーバー] を押し続けて、ベクター内のすべての単語がコンソールに出力されるまで続けることができます。しかし、興味がある場合は、[ステップイン] ボタンを押して、C++ 標準ライブラリのソースコードをステップ実行してみてください!

    Breakpoint in gcc standard library header

    自分のコードに戻る 1 つの方法は、[ステップオーバー] を押し続けることです。別の方法は、コードエディターで helloworld.cpp タブに切り替え、挿入ポイントをループ内の cout ステートメントのどこかに置き、F9 キーを押して、コードにブレークポイントを設定することです。赤い点が表示されます。左側の溝に、この行にブレークポイントが設定されていることを示す赤い点が表示されます。

    Breakpoint in main

    次に、F5 キーを押して、標準ライブラリヘッダーの現在の行から実行を開始します。実行は cout で中断されます。必要に応じて、F9 キーをもう一度押して、ブレークポイントをオフにすることもできます。

    ループが完了すると、統合ターミナルの [デバッグコンソール] タブに、GDB によって出力される他の診断情報とともに、出力が表示されます。

    Debug console display

ウォッチの設定

プログラムの実行中に変数の値を追跡するには、変数に ウォッチ を設定します。

  1. 挿入ポイントをループ内に配置します。[ウォッチ] ウィンドウで、プラス記号をクリックし、テキストボックスに、ループ変数の名前である word を入力します。ループをステップ実行しながら、[ウォッチ] ウィンドウを表示します。

    Watch window

  2. 実行がブレークポイントで一時停止している間に、変数の値をすばやく表示するには、マウスカーソルをその上に置きます。

    Mouse hover

次に、VS Code にプログラムをビルド (コンパイル) する方法を指示する tasks.json ファイルを作成します。このタスクは、g++ コンパイラを呼び出して、ソースコードから実行可能ファイルを作成します。

次の手順ではエディターのアクティブなファイルをコンテキストに使用して次の手順でビルドタスクを作成するため、helloworld.cpp がエディターで開いていることが重要です。

launch.json によるデバッグのカスタマイズ

再生ボタンまたは F5 キーでデバッグすると、C++ 拡張機能は動的なデバッグ構成をその場で作成します。

実行時にプログラムに渡す引数を指定するなど、デバッグ構成をカスタマイズしたい場合があります。カスタムデバッグ構成は、launch.json ファイルで定義できます。

launch.json を作成するには、再生ボタンのドロップダウンメニューから [デバッグ構成の追加] を選択します。

Add debug configuration play button menu

次に、事前定義されたさまざまなデバッグ構成のドロップダウンが表示されます。[g++ ビルドとアクティブなファイルのデバッグ] を選択します。

C++ debug configuration dropdown

VS Code は、次のような launch.json ファイルを作成します

{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "C/C++: g++ build and debug active file",
      "type": "cppdbg",
      "request": "launch",
      "program": "${fileDirname}/${fileBasenameNoExtension}",
      "args": [],
      "stopAtEntry": false,
      "cwd": "${workspaceFolder}",
      "environment": [],
      "externalConsole": false,
      "MIMode": "gdb",
      "miDebuggerPath": "/usr/bin/gdb",
      "setupCommands": [
        {
          "description": "Enable pretty-printing for gdb",
          "text": "-enable-pretty-printing",
          "ignoreFailures": true
        }
      ],
      "preLaunchTask": "C/C++: g++ build active file"
    }
  ]
}

上記の JSON では、program はデバッグするプログラムを指定します。ここでは、アクティブなファイルフォルダー ${fileDirname} と拡張子のないアクティブなファイル名 ${fileBasenameNoExtension} に設定されています。helloworld.cpp がアクティブなファイルの場合、helloworld になります。args プロパティは、実行時にプログラムに渡す引数の配列です。

既定では、C++ 拡張機能はソースコードにブレークポイントを追加せず、stopAtEntry 値は false に設定されます。

デバッグを開始するときにデバッガーが main メソッドで停止するようにするには、stopAtEntry 値を true に変更します。

今後は、再生ボタンと 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++ 構成] ページが開きます。ここで変更を行うと、VS Code はそれらを .vscode フォルダー内の c_cpp_properties.json という名前のファイルに書き込みます。

IntelliSense configuration window

プログラムにワークスペースまたは標準ライブラリパスにないヘッダーファイルが含まれている場合にのみ、[インクルードパス] 設定を変更する必要があります。

Visual Studio Code は、これらの設定を .vscode/c_cpp_properties.json に配置します。そのファイルを直接開くと、次のようになります

{
  "configurations": [
    {
      "name": "Linux",
      "includePath": ["${workspaceFolder}/**"],
      "defines": [],
      "compilerPath": "/usr/bin/gcc",
      "cStandard": "c11",
      "cppStandard": "c++17",
      "intelliSenseMode": "clang-x64"
    }
  ],
  "version": 4
}

C++ 構成の再利用

VS Code は、Linux で gcc を使用するように構成されました。構成は現在のワークスペースに適用されます。構成を再利用するには、JSON ファイルを新しいプロジェクトフォルダー (ワークスペース) の .vscode フォルダーにコピーし、必要に応じてソースファイルと実行可能ファイルの名前を変更するだけです。

トラブルシューティング

コンパイラとリンカーのエラー

エラー (undefined _main、または attempting to link with file built for unknown-unsupported file format など) の最も一般的な原因は、ビルドを開始またはデバッグを開始するときに helloworld.cpp がアクティブなファイルではない場合に発生します。これは、コンパイラが launch.jsontasks.jsonc_cpp_properties.json ファイルなどのソースコードではないものをコンパイルしようとしているためです。

次のステップ

  • VS Code ユーザーガイドをご覧ください。
  • C++ 拡張機能の概要を確認してください。
  • 新しいワークスペースを作成し、.json ファイルをそこにコピーし、新しいワークスペースパス、プログラム名などの必要な設定を調整して、コーディングを開始します!