WSLとVisual Studio CodeでC/C++開発環境を楽して作る（2019年7月）

## はじめに

既に色んなところで「VSCodeでC/C++開発環境を構築する手順」が溢れているけど、Visual Studio 付属の cl.exe を使う内容だったり、MinGW のためにコンフィグを書く内容だったり、WSL と VSCode の橋渡しに苦労する内容だったりする。

今年5月に使えるようになったらしい Remote Development を使うとかなり楽にできたので、似たネタは既出だけどオレオレ環境を簡単にまとめ。


### ポイント

- VSCode さんが WSL をよろしくやってくれるため、頑張ってコンフィグを書かなくてよい
- C++ でなくても WSL で動く Python や、リモートサーバで動く PHP などにも同様に使える
- MinGWやcygwinじゃないので、すごくLinuxで、とてもWSLていう感じ

### 環境

- Windows 10 (ver 1809)
- Visual Studio Codeはインストール済みの想定
    - 少し前はinsider版である必要があったそうだが、やってみたら安定版でもできた
- WSLの導入についても省略
    - 私の環境は Ubuntu 18.04LTS だが、なんでもよいはず


## WSLの準備

Linux側で`gcc`や`gdb`が使えるようにする。あらかじめ`sudo apt update`などをしておくと善い。次のコマンドで一括していろいろをインストールできる。

```bash
sudo apt install build-essential
```

インストール後に念の為、`gcc -v`や`gdb -v`を試すと佳い。ちなみに、私の環境だとgdbが入らなかったようなので、`apt install gdb` もした。

## VSCode に拡張機能 Remote Development を入れる

[Remote Development - Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.vscode-remote-extensionpack) を開きinstallボタンを押してVSCodeの拡張をインストールする。

※ Remote Development は WSL 向けの Remote-WSL だけでなく SSH や Docker 向けの拡張も含むパッケージなので、気になる人は WSL 向けのみをインストールすればよいかと


## C++ をビルドしてみる

### ディレクトリの作成

プロジェクトとして `/mnt/c/CppTest/`（Winのパスで`C:\CppTest\`に対応）みたいなディレクトリを作る。そこで、

```bash
cd /mnt/c/CppTest
code .
```

とすると、WSL に接続された VSCode が開く。最初はファイアウォールが立ち上がったり、VSCode の設定が実行されたりで少し時間がかかる。

![wsl_vscode_cpp_welcome.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228629/8265bbe4-d570-a5ea-b35b-b4b401efe085.png)

起動すると、WSLと接続している感じのあるアイコンが左下に出てくる。ちょっとした達成感

### VSCodeにC++拡張機能を入れる

WSL に接続した VSCode では、ローカル側の拡張とWSL側の拡張の2種類があり、[C/C++ 拡張](https://marketplace.visualstudio.com/items?itemName=ms-vscode.cpptools)は後者のリモート側にインストールしなくてはならない点に注意。

cppファイルを開くとインストールをおすすめされるので、未導入の場合はそこでインストールするのが分かりやすい。ローカル（Windows）のVS Code に既に導入されているなら、
![CppTest [WSL] - Visual Studio Code 2019_07_04 17_26_55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228629/5c300a82-eeb6-4613-0857-2845c0561a47.png)
「インストール on WSL」でWSL側にもインストールすることができる。

### main.cppの作成とビルド

プロジェクトディレクトリに次の main.cpp を作ってみる。

```c++
#include <cstdio>

int main()
{
    for (int i = 0; i < 10; i++)
    {
        printf("ふぇぇ… %d\n", i);
    }
    return 0;
}
```

1行目だけかろうじてC++っぽい以外はべたべたなC言語だけど、C++としてビルドします。ショートカットキー<kbd>Ctrl+Shift+B</kbd>で、こんな感じにコンパイラを選べるので、

![2019-07-08_07h40_34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228629/9214873f-e9d2-ff45-4572-14f355462e57.png)

今回はg++を選択。なお、歯車のアイコンをクリックするとtask.jsonがディレクトリに生成されて次回から選択が省略できる。次節のデバッグにはtask.jsonが必要なので、この時点で生成しておくのが佳い。

コンパイルが成功したら、VS Codeで実行を確認してみる。ソースファイルと同名の実行ファイルが作成されているので、<kbd>Ctrl+@</kbd>を押してターミナルを開き、`./main`を実行する。


## デバッガを使う

適当なところにブレークポイントをおいて、gdbを試してみる。<kbd>F5</kbd>でデバッグを実行しようとすると、言語や環境の選択を求められるので、
![2019-07-04_17h59_33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228629/d6bc6f5e-f3fa-90c9-c0ab-26efc45333c5.png)
![2019-07-04_18h00_18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228629/e7b04469-0847-2781-ee77-02dc06cff786.png)
適当に選んであげるとデバッグが始まる。
![main.cpp - CppTest [WSL] - Visual Studio Code [管理者] 2019_07_04 18_16_16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228629/70bdb259-cfb2-4949-2766-183751197660.png)
こんなプログラムでも、ブレークポイントで一時停止したり、変数が表示されたりするのが確認できた。やったぁ

### 「タスク'g++ build active file'を見つけられませんでした。」

![2019-07-04_18h07_49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228629/515c5daa-d168-cc33-24e3-ed53b76aa8ab.png)
と表示されてデバッグ出来ないのは、デバッグ前に'g++ build active file'という名のタスクを実行しようとしたが、そのタスクが見つからないから。ダイアログの「タスクの構成」を選択し、さらに構成するタスクを適切に（今回はg++）を選択すればtask.jsonが生成されて、デバッグできるようになるはず。


## あとがき

dockerを動かせるWSL2の正式版が近い将来出るそうだし、より一層 Windows が開発者向けとして佳くなりますね。今までOSがWinというだけで迫害されてきた開発者たちも、~~もはやただ高いだけのMacから~~ 馬鹿にされることはなくなるでしょう。素敵な未来です