Visual Studio 2017 と Bash on Ubuntu on Windows による C++ Linux 開発環境の構築

#Bash on Ubuntu on Windows と Visual Studio 2017 により Windows 10 上で、Linux アプリ開発が可能に！
Windows 10 Anniversary Update から、OS の機能一つとして、Linux のディストリビューションの一つである Ubuntu がサポートされるようになりました。Windows 環境で、Linux が利用可能です！

さらに、Visual Studio 2017 では、Linux の C++ 開発が標準でサポートされるようになりました。
Visual Studio の IDE を使い、C++ 開発を行い、コード上にプレイク ポイントを設定し、ステップ実行を行うことが可能です！！

#Bash on Ubuntu on Windows のインストールと構成
この Bash on Ubuntu on Windows は、デフォルトでは、有効化されないので、[Windows の機能の有効化または無効化] から、[Windows Subsystem for Linux(beta)] 選択して機能の有効化を行う必要があります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172205/39e2a2fb-f573-c725-8ce8-bd7ee66e02df.png)

機能を有効化後、[スタート スクリーン] から、[Bash on Ubuntu on Windows] を選択すると、初回起動時に、Windows ストアから Ubuntu がインストールされます。

```bash:

-- ベータ機能 --
これにより Windows に Ubuntu がインストールされます。Ubuntu は Canonical によって配布される製品であり、
次のサイトに示される条件に基づいてライセンスされています。
https://aka.ms/uowterms

続行するには、"y" を入力してください: y
Windows ストアからダウンロードしています... 100%
ファイル システムを展開しています。この処理には数分かかります...
Ubuntu のロケールを Windows のロケール (ja-JP) と一致するように設定しますか?
既定のロケールは en_US です。
続行するには、"y" を入力してください: y
既定の UNIX ユーザー アカウントを作成してください。ユーザー名は、Windows のユーザー名と一致する必要はありません。
詳細: https://aka.ms/wslusers を参照してください
新しい UNIX ユーザー名を入力してください: root
UNIX ユーザーが見つかりました: root
インストールが正常に終了しました
環境が間もなく開始されます...
ドキュメントを参照できる場所: https://aka.ms/wsldocs
root@Ubuubu:/mnt/c/Windows/System32#
```
まず、g++ 等の開発環境をインストールします。

```bash:
root@Ubuubu:~# sudo apt install -y build-essential
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下の追加パッケージがインストールされます:
(省略)
```

次に、リモート デバッグを可能にする gdbserver をインストールします。

```bash:
root@Ubuubu:~# sudo apt install -y gdbserver
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下のパッケージが新たにインストールされます:
  gdbserver
(省略)
```
SSH サーバーをインストールします。

```bash:
root@Ubuubu:~# sudo apt install -y openssh-server
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
(省略)
```

任意のテキスト エディタを使い sshd_config を開き、“PasswordAuthentication” を "yes" に設定します。

```bash: 
root@Ubuubu:~# sudo vi/etc/ssh/sshd_config
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172205/d400f666-09b1-a131-95a3-652490ade07e.png)

SSH キーを生成します。

```bash: 
root@Ubuubu:~# sudo ssh-keygen -A
```

SSH サーバーを起動します。

```bash:
root@Ubuubu:~# sudo service ssh start
 * Starting OpenBSD Secure Shell server sshd                                                                     [ OK ]
```

**(*)Bash on Ubuntu on Windows のプロセスを終了すると SSH サーバーも終了していまいますので、Bash on Ubuntu on Windows のプロセス起動時には、SSH サーバーも起動するようにしてください。**

SSH のデフォルトでは、root 権限のログオンに制限がありますので、任意のユーザーを追加しておきます。

```bash:
root@Ubuubu:~#  sudo adduser debug002
ユーザー `debug002' を追加しています...
新しいグループ `debug002' (1001) を追加しています...
新しいユーザー `debug002' (1001) をグループ `debug002' に追加しています...
ホームディレクトリ `/home/debug002' を作成しています...
`/etc/skel' からファイルをコピーしています...
新しい UNIX パスワードを入力してください:
新しい UNIX パスワードを再入力してください:
passwd: password updated successfully
Changing the user information for debug002
Enter the new value, or press ENTER for the default
        Full Name []:
        Room Number []:
        Work Phone []:
        Home Phone []:
        Other []:
以上で正しいですか? [Y/n] y
```

#Visual Studio 2017 による Linux C++ 開発の設定 

[スタート スクリーン] から [Visual Studio Installer] を起動します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172205/3f94fd04-19ba-7db6-0d46-3d73d8037525.png)

[変更] - [ワークロード] - [C++ による Linux 開発] を選択して、[変更] を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172205/f924b187-cbd3-e025-6630-05d481184ecc.png)

インストール完了後、Visual Studio 2017 を起動します。
起動後、[ツール] - [オプション] - [クロス プラットフォーム] - [接続マネージャー] - [追加] を選択します。
[リモート システムへの接続] ダイアログの [ホスト名] を "localhost"、 [ポート] を "22"、 [ユーザー名] を "debug002"(任意)、[認証の種類] を "パスワード"、[パスワード] を "debug002"(任意)のパスワードとして、[接続] を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172205/d61b782c-4848-b9dd-5687-a18c7228173f.png)

次に、アプリケーションを作成します。
[ファイル] - [新規作成] - [プロジェクト] - [コンソール アプリケーション(Linux)] を選択し、[OK] を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172205/0e076556-3068-eb6e-0bc1-70e9155359bb.png)

main.cpp のコードを参照し、5 行目にブレイク ポイントを設定します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172205/32c848ae-b245-e21b-885f-81e26760f383.png)

[リモート GDB デバッガー] を選択し、デバッガーを起動します。
ファイヤー ウォールの警告が出る場合、アクセスを許可します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172205/dd52f9f6-f61e-0cad-4181-f09799c37c9a.png)

デバッガーが起動すると、ブレイク ポイントにヒットして待機していることが分かります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172205/2e4c5076-5c76-95bf-319a-aeee24ec57be.png)

Linux の出力は、[デバッグ] - [Linux コンソール] から、 [Linux Console Window] を起動できます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172205/3c9a719e-227e-849b-28fc-ddbdb079c7b7.png)

コーディングの多くで Visual Studio を使っている場合、やはり、他のツール、IDE では物足りなくなる。
VC++ で書いたものを Linux へ持っていこうとするが、やはり、g++ と違うことが多くて、苦労していました。

Visual Studio 2017 で Linux 開発出来て、さらに、Linux 自体も Windows 10 でサポートされるって、非常に欲しかった方向に進んで、必然の進歩なのかもしれませんが、Windows と Linux の親和性の強化、今後とも期待が持てる分野と考えています！！