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); }
動作確認した環境
- Windows 10 Home 64bit バージョン 1703 OSビルド 15063.13
- Bash on Windows (Ubuntu 16.04.1 LTS)
- Visual Studio Community 2017 Version 15.1 (26403.3) Release 日本語
bashにdbdserverとopenssh-serverとgcc6をインストールする
bash自体の導入は以下記事などを参照してください。
- 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 StudioにLinux開発環境を導入する
Visual Studio 2017をインストールしだけではLinuxとのリモートビルド&デバッグをする機能は入っていません。 LinuxによるC++開発
というツールキットをインストールする必要があります。
Visual Studio 2017のインストーラーを起動すると、ツールキットのインストールを行うことが出来ます。
「インストール済み」見出しの、Visual Studioの項目に、「変更」と「起動」というボタンがあります。*5
「変更」ボタンを押して「ワークロード」タブをスクロールします。そしたら下図のように、「LinuxによるC++開発」というツールキットがでてきるので、それをインストールしてください。
続いて、Visual Studio 2017を起動し設定を行います。「ツール」>「オプション」を開き、ダイアログの左のツリーから「クロスプラットフォーム」を選択します。 右側の「追加」ボタンを押しフォームに以下を入力し接続します:
- ホスト名: localhost
- ポート: 22(デフォルトのまま)
- ユーザ名: Bash on Windowsのユーザ名を入力してください
- 認証の種類: パスワード(デフォルトのまま)
- パスワード: Bash on Windowsのパスワード
成功すると、OS名を確認することが出来ます(ユーザ名は塗りつぶしてます)。
これで環境構築は完了です。実際にVisual Studioでプロジェクトを作成し、Linux(WLS)でビルド&デバッグしてみましょう。
プロジェクトを作成しビルドやデバッグを行う
Visual Studio 2017を起動し「ファイル」>「新規作成」>「プロジェクト」を選択し、ウィザードを開きます。上記の「LinuxによるC++開発」がインストール済みであれば「テンプレート」>「Visual C++」>「クロスプラットフォーム」>「Linux」があります。「Linux」を開き、 空のプロジェクト(Linux)
を選択してプロジェクトを作成します。
新規でC++ファイルを追加し、プロジェクトのプロパティを開きます。開いたら「構成プロパティ」>「C/C++」>「全般」を選択し、C++コンパイラを g++-6
にします。
今回はgcc6系の試験実装のconceptを試すために、「コマンドライン」を選択し -fconcepts
を追加します。
ここまで準備できたら、この記事の冒頭に貼ったコードをコピペしてビルドします。デバッグ実行もVisual Studio上から行え、出力はLinuxコンソールで確認できます。Linuxコンソールはメニューから開けます。「デバッグ」>[Linux コンソール」です。ビルドとデバッグ実行の方法は通常のVisual C++やVisual C#などのビルドやデバッグと同じ方法で行なえます。
ちなみにLinuxの出力ディレクトリはプロジェクトのプロパティの「構成プロパティ」を選択し、全般のリモートビルドルートディレクトリとリモートビルドプロジェクトディレクトリで変更することが出来ます。
参考サイト
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を最新の状態にしてから改めて確認をしてください