VS Code で C++ と WSL を使用する

このチュートリアルでは、Windows Subsystem for Linux (WSL) 上の Ubuntu で GCC C++ コンパイラー (g++) と GDB デバッガーを使用するように、Visual Studio Code を構成します。GCC は GNU Compiler Collection、GDB は GNU デバッガーを指します。WSL は、仮想マシンではなくマシンのハードウェア上で直接実行される、Windows 内の Linux 環境です。

注意: このチュートリアルの大部分は、Linux マシン上で直接 C++ と VS Code を使用して作業する場合にも適用できます。

Visual Studio Code は、WSL 拡張機能を使用して WSL 内で直接作業することをサポートしています。コンパイラーに加えて、すべてのソースコードファイルを Linux ディストリビューション上に配置する、この WSL 開発モードをお勧めします。詳細な背景については、VS Code リモート開発を参照してください。

このチュートリアルを完了すると、独自の C++ プロジェクトを作成および構成し、VS Code の豊富な機能についてさらに調べる準備が整います。このチュートリアルでは、GCC、Linux、または C++ 言語自体については説明しません。これらのトピックについては、Web 上に多くの優れたリソースが存在します。

何か問題が発生した場合は、お気軽に VS Code ドキュメントリポジトリでこのチュートリアルのイシューを作成してください。

前提条件

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

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

  2. WSL 拡張機能をインストールします。

  3. Windows Subsystem for Linux をインストールし、同じページにあるリンクを使用して、任意の Linux ディストリビューションをインストールします。このチュートリアルでは Ubuntu を使用します。インストール中に、Linux ユーザーのパスワードを忘れないように控えておいてください。追加のソフトウェアをインストールする際に必要になります。

Linux 環境のセットアップ

  1. WSL の Bash シェルを開きます。Ubuntu ディストリビューションをインストールした場合は、Windows の検索ボックスに「Ubuntu」と入力し、検索結果に表示された項目をクリックします。Debian の場合は「Debian」と入力します(他も同様です)。

    Ubuntu in Start Menu

    シェルが起動するとコマンドプロンプトが表示されます。デフォルトではユーザー名とコンピューター名で構成され、カレントディレクトリはホームディレクトリになります。Ubuntu の場合は次のようになります。

    Bash Shell

  2. projects というディレクトリを作成し、さらにその下に helloworld というサブディレクトリを作成します。

    mkdir projects
    cd projects
    mkdir helloworld
    
  3. ソースコードの編集には VS Code を使用しますが、コンパイルは Linux 上で g++ コンパイラーを使用して行います。また、デバッグも Linux 上で GDB を使用して行います。これらのツールは Ubuntu にデフォルトでインストールされていないため、手動でインストールする必要があります。幸い、その作業は非常に簡単です!

  4. WSL のコマンドプロンプトから、まず apt-get update を実行して Ubuntu のパッケージリストを更新します。パッケージリストが古いと、新しいパッケージのインストールに失敗することがあります。

    sudo apt-get update
    

    必要に応じて、sudo apt-get update && sudo apt-get dist-upgrade を実行してシステムパッケージも最新バージョンにアップグレードできますが、接続速度によってはかなり時間がかかる場合があります。

  5. コマンドプロンプトから、次のように入力して GNU コンパイラーツールと GDB デバッガーをインストールします。

    sudo apt-get install build-essential gdb
    
  6. g++ と gdb の場所を確認して、インストールが成功したことを検証します。whereis コマンドでファイルパスが返されない場合は、もう一度パッケージリストの更新コマンドを実行してみてください。

    whereis g++
    whereis gdb
    

注意: g++ コンパイラーと GDB デバッガーをインストールするセットアップ手順は、WSL ではなく実際の Linux マシン上で直接作業している場合にも適用されます。helloworld プロジェクトでの VS Code の実行や、編集、ビルド、デバッグの手順は同様です。

WSL で VS Code を実行する

helloworld プロジェクトフォルダーに移動し、WSL ターミナルから code . を使用して VS Code を起動します。

cd $HOME/projects/helloworld
code .

「Installing VS Code Server」というメッセージが表示されます。VS Code は、デスクトップ側の VS Code と通信するために、Linux 側に小さなサーバーをダウンロードしてインストールしています。その後、VS Code が起動し、helloWorld フォルダーが開きます。エクスプローラーを見ると、VS Code が WSL のコンテキストで実行されていることがわかります。タイトルバーには WSL: Ubuntu と表示されます。

File Explorer in WSL

ステータスバーからも、リモート接続しているコンテキストを確認できます。

Remote context in the Status bar

リモートステータスバーの項目をクリックすると、そのセッションで利用可能なリモートコマンドのドロップダウンが表示されます。たとえば、WSL で実行中のセッションを終了したい場合は、ドロップダウンから Close Remote Connection コマンドを選択できます。WSL のコマンドプロンプトから code . を実行すると、再び WSL 上で VS Code が起動します。

code . コマンドにより、現在の作業フォルダー(これが「ワークスペース」になります)で VS Code が開きます。チュートリアルを進めると、ワークスペースの .vscode フォルダー内に 3 つのファイルが作成されます。

  • c_cpp_properties.json (コンパイラパスと IntelliSense 設定)
  • tasks.json (ビルド手順)
  • launch.json (デバッガ設定)

ソースコードファイルの追加

ファイルエクスプローラーのタイトルバーで、**新規ファイル**ボタンを選択し、ファイル名をhelloworld.cppとします。

New File title bar button

C/C++ 拡張機能のインストール

ファイルを作成し、それが C++ 言語のファイルであることを VS Code が検出すると、まだインストールしていない場合は Microsoft C/C++ 拡張機能をインストールするように促される場合があります。

C++ extension notification

拡張機能ビューで Install を選択し、ボタンが表示されたら Reload Required を選択して、C/C++ 拡張機能のインストールを完了します。

ローカルの VS Code に C/C++ 言語拡張機能がすでにインストールされている場合は、拡張機能ビュー (⇧⌘X (Windows、Linux は Ctrl+Shift+X)) に移動し、それらの拡張機能を WSL にインストールする必要があります。ローカルにインストール済みの拡張機能は、Install in WSL ボタンを選択し、次に Reload Required を選択することで WSL にインストールできます。

Install in WSL button

hello worldソースコードを追加する

ここで、このソースコードを貼り付けます。

#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

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

左端のアクティビティバーを使用すると、SearchSource ControlRun などのさまざまなビューを開くことができます。Run ビューについては、このチュートリアルの後半で説明します。その他のビューの詳細については、VS Code の ユーザーインターフェースドキュメントを参照してください。

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++ build and debug active file を選択します。

    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" のような引数を使用するように tasks.json を変更することで、複数の C++ ファイルをビルドできます。これにより、現在のフォルダー内のすべての .cpp ファイルがビルドされます。また、"${fileDirname}/${fileBasenameNoExtension}" を固定のファイル名(例: 'helloworld.out')に置き換えることで、出力ファイル名を変更することも可能です。

helloworld.cpp をデバッグする

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

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

再生ボタンには Run C/C++ FileDebug C/C++ File の 2 つのモードがあり、デフォルトでは最後に使用したモードになります。再生ボタンにデバッグアイコンが表示されている場合は、ドロップダウンメニューから項目を選択する代わりに、再生ボタンをクリックしてデバッグを開始できます。

デバッガーを探索する

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

  • 統合ターミナルがソースコードエディタの下部に表示されます。**デバッグ出力** タブには、デバッガーが実行中であることを示す出力が表示されます。

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

    Initial breakpoint

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

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

    Debugging controls

ワークスペースにすでに launch.json ファイルが存在する場合、再生ボタンはそこから設定を読み取って C++ ファイルを実行およびデバッグする方法を決定します。launch.json が存在しない場合、再生ボタンはその場で一時的な「クイックデバッグ」構成を作成するため、launch.json は不要になります。

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

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

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

    Step over button

    これにより、プログラムの実行が for ループの最初の行に進み、msg 変数の作成・初期化時に呼び出される vectorstring クラス内部の関数呼び出しをすべてスキップします。横の Variables ウィンドウの表示が変化することに注目してください。

    Debugging windows

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

  3. もう一度 Step over を押して、cout ステートメントを実行します(C++ 拡張機能は、最後の cout が実行されるまで Debug Console に何も出力しない点に注意してください)。

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

    Breakpoint in gcc standard library header

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

    Breakpoint in main

    次に、F5 を押して、標準ライブラリ ヘッダーの現在の行から実行を開始します。実行は cout で停止します。必要に応じて、F9 をもう一度押してブレークポイントを切り替えることができます。

    ループが完了すると、統合ターミナルの Debug Console タブに、GDB が出力した他の診断情報と一緒に出力が表示されます。

    Debug console display

ウォッチを設定する

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

  1. カーソルをループ内に配置します。Watch ウィンドウでプラス記号をクリックし、テキストボックスにループ変数の名前である word を入力します。ここで、ループをステップ実行しながら Watch ウィンドウの変化を確認します。

    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++ build and debug active file を選択します。

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 というファイルに書き込みます。

Command Palette

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

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
}

WSL セッションの終了

WSL ででの作業が完了したら、メインの File メニューやコマンドパレット (⇧⌘P (Windows、Linux は Ctrl+Shift+P)) にある Close Remote Connection コマンドを使用してリモートセッションを終了できます。これにより、ローカルで実行される VS Code が再起動します。再び WSL セッションを開くには、File > Open Recent の一覧から [WSL] サフィックスが付いたフォルダーを選択するだけで簡単に行えます。

次のステップ

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