VS Codeのエージェントモードを拡張するには、を試してください!

VS Code で Linux 上の 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 ドキュメント リポジトリでこのチュートリアルの Issue を提出してください。

前提条件

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

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

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

    C/C++ extension

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

ソース コードの編集には VS Code を使用しますが、Linux 上では g++ コンパイラを使用してソース コードをコンパイルします。デバッグには 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) を押してファイルを保存します。ファイルは VS Code のサイドバーのファイル エクスプローラー ビュー (⇧⌘E (Windows、Linux では Ctrl+Shift+E)) に表示されることに注目してください。

File Explorer

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

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

: C++ ファイルを保存または開くと、C/C++ 拡張機能から Insiders バージョンの利用可能性に関する通知が表示される場合があります。これは、新機能や修正をテストできるものです。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 の変更

tasks.json を変更して、"${file}" の代わりに "${workspaceFolder}/*.cpp" のような引数を使用することで、複数の C++ ファイルをビルドできます。これにより、現在のフォルダー内のすべての .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 _mainattempting to link with file built for unknown-unsupported file format など) の最も一般的な原因は、ビルドを開始したりデバッグを開始したりするときに、helloworld.cpp がアクティブ ファイルではない場合に発生します。これは、コンパイラがソース コードではないもの (たとえば、launch.jsontasks.json、または c_cpp_properties.json ファイル) をコンパイルしようとしているためです。

次のステップ

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