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ドキュメントリポジトリでこのチュートリアルに関するイシューを報告してください。
前提条件
このチュートリアルを正常に完了するには、以下を行う必要があります
-
Visual Studio Code をインストールします。
-
VS Code用C++拡張機能をインストールします。C/C++拡張機能は、拡張機能ビュー(⇧⌘X(Windows、Linux Ctrl+Shift+X))で「c++」を検索してインストールできます。

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という名前を付けます。

次のソース コードを貼り付けます。
#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))に表示されていることを確認してください

メインの **ファイル** メニューで **自動保存** をオンにすることで、ファイル変更を自動保存する 自動保存を有効にすることもできます。
Visual Studio Codeの端にあるアクティビティバーを使用すると、検索、ソース管理、実行などのさまざまなビューを開くことができます。このチュートリアルの後半で実行ビューについて説明します。その他のビューの詳細については、VS Codeのユーザーインターフェースのドキュメントをご覧ください。
注意: C++ ファイルを保存または開くと、C/C++ 拡張機能から Insiders バージョンの利用可能性に関する通知が表示される場合があります。これにより、新機能や修正をテストできます。
X(通知をクリア) を選択して、この通知を無視できます。
IntelliSense を探索する
helloworld.cppファイルで、vectorまたはstringの上にホバーして型情報を表示します。msg変数の宣言の後、メンバー関数を呼び出すときと同じように「msg.」と入力し始めます。すぐに、すべてのメンバー関数を示す補完リストと、msgオブジェクトの型情報を表示するウィンドウが表示されます

Tabキーを押して、選択したメンバーを挿入できます。次に、開き括弧を入力すると、その関数が必要とする引数に関する情報が表示されます。
helloworld.cpp を実行する
C++ 拡張機能は、コンピューターにインストールされている C++ コンパイラを使用してプログラムをビルドすることを忘れないでください。VS Code で helloworld.cpp を実行およびデバッグする前に、C++ コンパイラがインストールされていることを確認してください。
-
helloworld.cppを開いて、アクティブなファイルにします。 -
エディタの右上隅にある再生ボタンを押します。

-
システムで検出されたコンパイラのリストから、g++ build and debug active fileを選択します。

helloworld.cpp を初めて実行する際にのみ、コンパイラを選択するように求められます。このコンパイラは、tasks.json ファイルの「デフォルト」コンパイラとして設定されます。
-
ビルドが成功すると、プログラムの出力が統合 **ターミナル** に表示されます。

プログラムを初めて実行すると、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++に渡されるコマンドライン引数を指定します。これらの引数は、コンパイラが期待する順序で指定する必要があります。
このタスクは、アクティブなファイル(${file})を取得してコンパイルし、現在のディレクトリ(${fileDirname})に、アクティブなファイルと同じ名前で拡張子なし(${fileBasenameNoExtension})の実行可能ファイル(この例ではhelloworldになります)を作成するようg++に指示します。
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 をデバッグする
コードをデバッグするには、
helloworld.cppに戻って、アクティブなファイルにします。- エディタのマージンをクリックするか、現在の行で F9 を使用してブレークポイントを設定します。

- 再生ボタンの横にあるドロップダウンから、**C/C++ ファイルのデバッグ** を選択します。

- システムで検出されたコンパイラのリストから、C/C++: g++ build and debug active fileを選択します(
helloworld.cppを初めて実行またはデバッグするときのみ、コンパイラの選択を求められます)。
再生ボタンには、C/C++ ファイルの実行とC/C++ ファイルのデバッグの2つのモードがあります。デフォルトでは、最後に使用されたモードになります。再生ボタンにデバッグアイコンが表示されている場合は、ドロップダウンメニュー項目を選択する代わりに、再生ボタンを選択するだけでデバッグできます。
デバッガーを探索する
コードのステップ実行を開始する前に、ユーザーインターフェイスのいくつかの変更点に注目しましょう。
-
統合ターミナルがソースコードエディタの下部に表示されます。**デバッグ出力** タブには、デバッガーが実行中であることを示す出力が表示されます。
-
エディターは、デバッガを開始する前に設定したブレークポイントである12行目をハイライトします

-
左側の **実行とデバッグ** ビューには、デバッグ情報が表示されます。チュートリアルの後半で例を示します。
-
コードエディタの上部に、デバッグ コントロール パネルが表示されます。左側のドットをつかんで画面上を移動させることができます。

ワークスペースにすでにlaunch.jsonファイルがある場合、再生ボタンはそこから設定を読み取って、C++ファイルの実行およびデバッグ方法を決定します。launch.jsonがない場合、再生ボタンはその場で一時的な「クイックデバッグ」構成を作成するため、launch.jsonはまったく不要になります!
コードをステップ実行する
これで、コードのステップ実行を開始する準備ができました。
-
デバッグ コントロール パネルの **ステップ オーバー** アイコンをクリックまたは押します。

これにより、プログラムの実行がforループの最初の行に進み、
msg変数が作成されて初期化されるときに呼び出されるvectorクラスおよびstringクラス内のすべての内部関数呼び出しをスキップします。サイドにある変数ウィンドウの変化に注目してください。
-
**ステップ オーバー** をもう一度押すと、プログラムの次のステートメントに進みます (ループの初期化のために実行されるすべての内部コードをスキップします)。これで、**変数** ウィンドウにループ変数に関する情報が表示されます。
-
もう一度ステップオーバーを押して、
coutステートメントを実行します(C++拡張機能は、最後のcoutが実行されるまでデバッグコンソールに出力を出力しないことに注意してください)。 -
必要に応じて、ベクターのすべての単語がコンソールに出力されるまで **ステップ オーバー** を押し続けることができます。しかし、興味がある場合は、**ステップ イン** ボタンを押して、C++ 標準ライブラリのソース コードをステップ実行してみてください。

自分のコードに戻るには、**ステップ オーバー** を押し続ける方法があります。別の方法として、コードにブレークポイントを設定するには、コードエディタの
helloworld.cppタブに切り替え、挿入ポイントをループ内のcoutステートメントのいずれかに置き、F9 を押します。左側のガターに赤いドットが表示され、この行にブレークポイントが設定されていることを示します。
次に、F5 を押して、標準ライブラリ ヘッダーの現在の行から実行を開始します。実行は
coutで停止します。必要に応じて、F9 をもう一度押してブレークポイントを切り替えることができます。ループが完了すると、統合ターミナルのデバッグコンソールタブに、GDBによって出力された他のいくつかの診断情報とともに出力が表示されます。

ウォッチを設定する
プログラムの実行中における変数の値を追跡するには、変数にウォッチ式を設定します。
-
カーソルをループ内に配置します。ウォッチ式ウィンドウでプラス記号をクリックし、テキストボックスにループ変数名である
wordを入力します。次に、ループをステップ実行しながらウォッチ式ウィンドウを確認します。
-
ブレークポイントで実行が一時停止している間に変数の値をすばやく表示するには、マウス ポインターで変数をホバーさせることができます。

次に、プログラムをビルド(コンパイル)する方法をVS Codeに指示するための tasks.json ファイルを作成します。このタスクは、g++コンパイラを呼び出して、ソースコードから実行可能ファイルを作成します。
エディターでhelloworld.cppを開いておくことが重要です。次のステップでは、ビルドタスクを作成するためのコンテキストとして、エディター内のアクティブなファイルを使用するためです。
launch.json でデバッグをカスタマイズする
再生ボタンまたは F5 でデバッグすると、C++ 拡張機能は動的なデバッグ構成をオンザフライで作成します。
デバッグ構成をカスタマイズしたい場合があります。たとえば、実行時にプログラムに渡す引数を指定するなどです。カスタム デバッグ構成は、launch.json ファイルで定義できます。
launch.json を作成するには、再生ボタンのドロップダウン メニューから **デバッグ構成の追加** を選択します。

定義済みのさまざまなデバッグ構成のドロップダウンが表示されます。g++ build and debug active fileを選択します。

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 を表示できます。

これにより、**C/C++ 設定** ページが開きます。ここで変更を行うと、VS Code はそれを .vscode フォルダーの c_cpp_properties.json というファイルに書き込みます。

ワークスペースまたは標準ライブラリのパスに存在しないヘッダーファイルがプログラムに含まれている場合のみ、インクルードパスの設定を変更する必要があります。
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++構成の再利用
これで、Linux上でgccを使用するようにVS Codeが構成されました。この構成は現在のワークスペースに適用されます。構成を再利用するには、JSONファイルを新しいプロジェクトフォルダー(ワークスペース)の .vscode フォルダーにコピーし、必要に応じてソースファイルや実行可能ファイルの名前を変更するだけです。
トラブルシューティング
コンパイルとリンクのエラー
最も一般的なエラー(undefined _main、attempting to link with file built for unknown-unsupported file formatなど)の原因は、ビルドやデバッグを開始するときにhelloworld.cppがアクティブなファイルになっていないことです。これは、コンパイラがlaunch.json、tasks.json、c_cpp_properties.jsonファイルなど、ソースコードではないものをコンパイルしようとするためです。
次のステップ
- VS Code ユーザーガイドを探索します。
- C++ 拡張機能の概要を確認します。
- 新しいワークスペースを作成し、.json ファイルをそこにコピーし、新しいワークスペース パス、プログラム名などの必要な設定を調整して、コーディングを開始してください。