C++と色々

主にC++やプログラムに関する記事を投稿します。

Visual Studio 2017と Bash on Windows を使ってC++に提案中のコンセプトを試す

この記事の内容はVisual C++公式ブログと同様になります。

Learn C++ Concepts with Visual Studio and the WSL | Visual C++ Team Blog

基本はVisual C++公式ブログ通りに行えばよいのですが、VS上でのremote buildの方法が別の記事になっていたり、bash側のssh serviceを動かすためにwindows側のサービスを1つ停止させなければいけないなど、一手間あったため備忘録として手順をまとめます。

この記事のゴール

上記のブログのサンプルコードと同じですが、以下のコードがVS上からビルド、デバッグできることを目標にします。

#include <iostream>
#include <type_traits>
 
template<class T>
concept bool Integral = std::is_integral<T>::value;
 
template<class T>
concept bool SignedIntegral = Integral<T> && T(-1) < T(0);
 
template<class T>
concept bool UnsignedIntegral = Integral<T> && T(0) < T(-1);
 
template<class T>
void f(T const& t) {
    std::cout << "Not integral: " << t << '\n';
}
 
void f(Integral) = delete;
 
void f(SignedIntegral i) {
    std::cout << "SignedIntegral: " << i << '\n';
}
 
void f(UnsignedIntegral i) {
    std::cout << "UnsignedIntegral: " << i << '\n';
}
 
int main() {
    f(42);
    f(1729u);
    f("Hello, World!");
    enum { bar };
    f(bar);
    f('a');
    f(L'a');
    f(U'a');
    f(true);
}

動作確認した環境

bashにdbdserverとopenssh-serverとgcc6をインストールする

bash自体の導入は以下記事などを参照してください。

qiita.com

  • gdbserver

リモートで GDB debuggerを実行するために必要になります

$ sudo apt install -y gdbserver
  • openssh-server

WindowsからWSLにアクセスするために必要になります

$ sudo apt install -y openssh-server
  • gcc6

2017年4月時点のWSL*1のOSはUbuntu 16.04 LTS*2なので標準のリポジトリにはまだgcc6系が入っていません。*3 そのためPPA*4 からgcc6を導入します。

sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt update
sudo apt install g++-6

これで g++-6 という名前でgcc6(正確にはg++6)が使えるようになります。

ssh serverを実行する前の準備

sshを開始する前に設定を変更する箇所があります。1度変更すれば済みます。 /etc/ssh/sshd_config を任意のエディタで管理者権限で開きます。例えば

$ sudo vi /etc/ssh/sshd_config

PasswordAuthentication という項目があり、デフォルトでは no になっているため yes に変更し保存します。

続いて、今度はWindows側で確認することがあります。ssh serverと接続する22番ポートがWindows側のサービス SSH Server Broker で使用されて使えない場合があります。 まず SSH Server Broker が動いているかどうか確認するために services.msc を起動して、サービス一覧にこれがあるかどうか確認してください。 存在しており、かつ状態が実行中ならば停止してください。存在しない、または実行中ではない場合は何もする必要はありません。

確認できたら、ssh serverを起動します。bashにてssh keyを生成します。

$ sudo ssh-keygen -A

ssh serverを起動します。ssh serverの起動はVisual StudioでWSLに接続する前に行う必要があります

$ sudo service ssh start

また、Bash on Windowsを閉じるとssh serverは終了します。再び接続するにはBash on Windowsを立ち上げたら再び $ sudo service ssh start を実行してください。

Visual StudioLinux開発環境を導入する

Visual Studio 2017をインストールしだけではLinuxとのリモートビルド&デバッグをする機能は入っていません。 LinuxによるC++開発 というツールキットをインストールする必要があります。 Visual Studio 2017のインストーラーを起動すると、ツールキットのインストールを行うことが出来ます。 「インストール済み」見出しの、Visual Studioの項目に、「変更」と「起動」というボタンがあります。*5

f:id:nekko1119:20170413025754p:plain

「変更」ボタンを押して「ワークロード」タブをスクロールします。そしたら下図のように、「LinuxによるC++開発」というツールキットがでてきるので、それをインストールしてください。

f:id:nekko1119:20170413025422p:plain

続いて、Visual Studio 2017を起動し設定を行います。「ツール」>「オプション」を開き、ダイアログの左のツリーから「クロスプラットフォーム」を選択します。 右側の「追加」ボタンを押しフォームに以下を入力し接続します:

  • ホスト名: localhost
  • ポート: 22(デフォルトのまま)
  • ユーザ名: Bash on Windowsのユーザ名を入力してください
  • 認証の種類: パスワード(デフォルトのまま)
  • パスワード: Bash on Windowsのパスワード

成功すると、OS名を確認することが出来ます(ユーザ名は塗りつぶしてます)。

f:id:nekko1119:20170413030719p:plain

これで環境構築は完了です。実際にVisual Studioでプロジェクトを作成し、Linux(WLS)でビルド&デバッグしてみましょう。

プロジェクトを作成しビルドやデバッグを行う

Visual Studio 2017を起動し「ファイル」>「新規作成」>「プロジェクト」を選択し、ウィザードを開きます。上記の「LinuxによるC++開発」がインストール済みであれば「テンプレート」>「Visual C++」>「クロスプラットフォーム」>「Linux」があります。「Linux」を開き、 空のプロジェクト(Linux) を選択してプロジェクトを作成します。

f:id:nekko1119:20170417011636p:plain

新規でC++ファイルを追加し、プロジェクトのプロパティを開きます。開いたら「構成プロパティ」>「C/C++」>「全般」を選択し、C++コンパイラg++-6 にします。

f:id:nekko1119:20170417014842p:plain

今回はgcc6系の試験実装のconceptを試すために、「コマンドライン」を選択し -fconcepts を追加します。

f:id:nekko1119:20170417020535p:plain

ここまで準備できたら、この記事の冒頭に貼ったコードをコピペしてビルドします。デバッグ実行もVisual Studio上から行え、出力はLinuxコンソールで確認できます。Linuxコンソールはメニューから開けます。「デバッグ」>[Linux コンソール」です。ビルドとデバッグ実行の方法は通常のVisual C++やVisual C#などのビルドやデバッグと同じ方法で行なえます。

f:id:nekko1119:20170417023512p:plain

ちなみにLinuxの出力ディレクトリはプロジェクトのプロパティの「構成プロパティ」を選択し、全般のリモートビルドルートディレクトリとリモートビルドプロジェクトディレクトリで変更することが出来ます。

参考サイト

blog.fileshelfplus.com

Learn C++ Concepts with Visual Studio and the WSL | Visual C++ Team Blog

*1:Windows Subsystem for Linux

*2:creators update適用済み

*3:普通にsudo apt install gccすると5.4が入りました

*4:Personal Package Archives。Ubuntuユーザーのチームや個人がそれぞれ管理している非公式のパッケージ管理システムのようなものです。 allabout.co.jp

*5:Visual Studioの更新がある場合は「変更」ボタンは「更新」ボタンになっています。Visual Studioを最新の状態にしてから改めて確認をしてください