Visual Studio Code を使った C++ のビルド&デバッグ方法

ということで,つくばチャレンジも一段落した今,ちょっと基礎的なエントリです.

仕事では Visual Studio を使って Windows メインで開発をしてるんですが,エディアとか IDE とかってなれるまでに時間がかかリますよね...なのでちょっと億劫だったんですが,流石に gedit でやるのも効率があんまり良くないかな..と思い,Linux でも何かエディタをつかうことにしました.C/C++ のエディタって,みんな eclipse CDT を使っているのかな?と思ってたんですが,最近はあまり eclipse ってつかわれてないんですかね?いろいろ記事を詠んでみると Visual Studio Code を扱っている記事が多かったので,ちょっと Eclipse CDT と Visual Studio Code を勉強&比較してみることにしました.

1.インストール方法

1.1 VSCODEのインストール

インストールは簡単でした.Ubuntu Softwareで検索窓に "vscode" って入れると Visual Studio Code が出てくるので,これをインストールします.

1.2 CPP extension のインストール

VSCODEでは,intellisense とか debugging のために extension をインストールする必要があります.ただ,これも VSCODE 経由で全部インストールできます.赤で囲ったボタンが Extension ボタンで,これを押すと同じく赤で囲った Extension の検索窓が出てきます.ここに,cpptoolsと入力すると,C/C++っていう一番上に出てきている Extension が検索結果として表示されるので,これをインストールします.
f:id:rkoichi2001:20181116081459p:plain

2.C++コードの作成とコンパイル

2.1 サンプルディレクトリとファイルの作成

まず,vscodeを開きます.この状態ではワークスペースとか何も設定されてない状態なので,サンプルのフォルダを作ります.青の "Open Folder" ってボタンを押せばフォルダチューザーが出てくるので,そこで適当なフォルダを選択します.フォルダを選択すると,選択したフォルダ "VS_CODE_SAMPLE_CPP" が起点になります.
f:id:rkoichi2001:20181116075226p:plain

で,次に src, include, build ディレクトリを作ってみます.ディレクトリもファイルの追加も vscode 上からできます.(VS_CODE_SAMPLE_CPPという表記の横に4つボタンが見えてますが,このボタンでファイル・フォルダの追加ができます.)
f:id:rkoichi2001:20181116075840p:plain

次に,作成した src ディレクトリにサンプルの cpp ファイル,include ディレクトリにサンプルの hpp ファイルを入れたらひとまず下準備完了です.

2.2 C/C++のコンフィグレーション設定

Ctrl + Shift + P を同時押しすると,コマンド窓?のようなものが表示されます.先ほどの C/C++ Extension がインストールされていれば,ここで "C/Cpp Edit Configuration" という選択肢が出てくると思います.下記の赤枠で囲った部分です.
f:id:rkoichi2001:20181116082016p:plain

この選択肢を実行すると,ルートフォルダの下に ".vscode" というディレクトリができます.このディレクトリにVSCODE関連の設定ファイルが入ってきます.と同時に c_cpp_properties.json というファイルができますが,この json ファイルが C/CPP extension が使う C/CPP の設定になります.
f:id:rkoichi2001:20181116082312p:plain

おそらく設定可能な変数は山のようにあると思うのですが,ひとまず下記の設定をすれば基本的な部分は抑えられるのかと.このワークスペースの構成では,ヘッダファイルは include フォルダに置くという前提で,"includePath" を workspaceFolder/include としています.

{
    "configurations": [
        {
            "name": "Linux",
            "includePath": [
                "${workspaceFolder}/include"
            ],
            "defines": [],
            "compilerPath": "/usr/bin/gcc",
            "cStandard": "c11",
            "cppStandard": "c++17",
            "intelliSenseMode": "clang-x64"
        }
    ],
    "version": 4
}
2.3 サンプルコードの作成

ここまで来ると,Intellisenseが動くようになっていると思うので,サンプルコードが俄然作りやすくなっていると思います.
f:id:rkoichi2001:20181116082820p:plain

完成版サンプルコード

#include <iostream>

int main(int argc, char const *argv[])
{
  std::cout << "Hello World!" << std::endl;

  for (int i = 0; i < 10; i++) {
    std::cout << "Sample For Loop : " << i << std::endl;
  }

  return 0;
}
2.4 ビルドタスクの作成

サンプルコードが完成したら,次にタスクを作ります.VSCODEでは,ビルドとかデバッグとかをタスクという単位で管理してます.なので,コンパイルとかビルドとかデバッグとかのためにタスクを作ってあげる必要があります.

2.4.1.Ctrl + Shift + P でバー表示,"Configure Task" を選択
f:id:rkoichi2001:20181116090549p:plain

2.4.2.”Create tasks.json” を選択
f:id:rkoichi2001:20181116090638p:plain

2.4.3.”Others” を選択
f:id:rkoichi2001:20181116090709p:plain

2.4.4."tasks.json" テンプレートが表示されるので,各々の環境に適した設定に変更
f:id:rkoichi2001:20181116090755p:plain

最終的に,自分の環境では下記のように tasks.json ファイルを更新しました.
下記 command がそのまんま g++ の実行ファイルになってて,args に引数を一通り入れて渡す感じですかね.ちなみに,"group" って書いてあるタグがあると思うんですが,ここで "build" を指定することによってこのタスクがビルドタスクであるとに認識されて,Ctrl + Shift + B ボタンを押すことによってビルドできるようになります.

{
  // See https://go.microsoft.com/fwlink/?LinkId=733558
  // for the documentation about the tasks.json format
  "version": "2.0.0",
  "tasks": [
    {
      "label": "echo",
      "type": "shell",
      "command": "g++",
      "args":[
          "-g", "${file}", "-o", "${fileBasenameNoExtension}"
      ],
      "group":{
        "kind": "build",
        "isDefault": true
      }
    }
  ]
}

2.4.5.ビルドの実行
ここまでくれば,ビルドの実行は簡単にできます.sample.cpp を開いた状態で,Ctrl + Shift + B を同時押ししてやると,ビルドが走って実行ファイルができます.下記,ターミナルの出力結果です.

> Executing task: g++ -g /home/koichi/workspace/vs_code_sample_cpp/src/sample1.cpp -o sample1 <
Terminal will be reused by tasks, press any key to close it.

でフォルダを見てみると,想定どおり実行ファイルができてます.

3 デバッグ環境の設定

サンプルコードのビルドがうまく行ったので,次はデバッグ環境の設定です.デバッグの設定に関しても,json ファイルを生成してあげる必要があります.

3.1 launch.jsonファイルの雛形生成
まず,デバッグボタンを押して,Configureボタンを押します.
f:id:rkoichi2001:20181117010219p:plain

3.2 launch.jsonファイルの修正.
3.1を実行すると,下記のようにlaunch.jsonファイルの雛形が出来上がります.
f:id:rkoichi2001:20181117010506p:plain
デバッグしたい実行ファイルを"program"に指定する必要があります.

{
  // Use IntelliSense to learn about possible attributes.
  // Hover to view descriptions of existing attributes.
  // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
  "version": "0.2.0",
  "configurations": [
    {
      "name": "(gdb) Launch",
      "type": "cppdbg",
      "request": "launch",
      "program": "${workspaceFolder}/${fileBasenameNoExtension}",
      "args": [],
      "stopAtEntry": false,
      "cwd": "${workspaceFolder}",
      "environment": [],
      "externalConsole": true,
      "MIMode": "gdb",
      "miDebuggerPath": "/usr/bin/gdb",
      "setupCommands": [
        {
          "description": "Enable pretty-printing for gdb",
          "text": "-enable-pretty-printing",
          "ignoreFailures": true
        }
      ]
    }
  ]
}

3.3 デバッグの実行
ここまでくればあとは簡単にデバッグできます.
デバッグボタンを押して,先ほど作った launch.json が (gdb) Launch として表示されるので,これを実行すれば始まります.

f:id:rkoichi2001:20181117011426p:plain

実際のデバッグ実行の様子.
f:id:rkoichi2001:20181117011949p:plain


ということで,VSCODEを使ったC++のビルド&デバッグ実行でした.今回のケースは一番シンプルなもので,外部ライブラリとのリンク等もありませんでしたが,それは次回に!