Visual Studio 2017 の Linux C++ 開発機能

R2.0 2018-03-07 更新
- 日本語を使う場合の問題点。
- Linux 側でのプロジェクトの場所

#はじめに

Visual Studio 2017 がついにリリースされました。面白そうな機能が満載ですが、その中でもクロスプラットフォーム関連は興味のあるところです。ということで、Linux C++ 開発機能を試してみました。


#プロジェクトの作成

ファイルメニューから新しいプロジェクトを選んで表示されたダイアログで、Visual C++ を選ぶ。さらにクロスプラットフォームを展開して Linux を選ぶ。以下の例では「コンソールアプリケーション」を選択した。

![NewProject.png](https://qiita-image-store.s3.amazonaws.com/0/62802/6a1abe44-4136-b7f2-516f-0af5d59e252d.png)
Fig.1　新しいプロジェクト

名前とソリューション名を適切なものに変更してOKボタンをクリックするとプロジェクトが作成される。



main.cpp が作成されるので中身を見てみると次のような感じになる。

```c++
#include <cstdio>
 
int main()
{
    printf("hello from Console1!\n");
    return 0;
}
```


#実行とデバッグ

まず、ツールバーが次のイメージのようになっていることを確認する。なっていないときはそのように変更する。
#![RemoteDebugger.png](https://qiita-image-store.s3.amazonaws.com/0/62802/5970f0e8-2386-f320-f577-5766fb885921.png)
Fig.2　ツールバーの設定

「リモートGDBデバッガー」をクリックすると、最初だけ下のようなダイアログが開くので、Linux への接続内容を入力する。このダイアログは「ツール/オプション/Cross Platform」からでも開くことができる。

![Connection.png](https://qiita-image-store.s3.amazonaws.com/0/62802/608c32ad-1562-5d7a-f86a-366b263418f7.png)
Fig.3　Linux への接続設定

設定が終わるとビルドが行われて成功するとデバッガが起動されてデバッグが可能になる。

![Debugging.png](https://qiita-image-store.s3.amazonaws.com/0/62802/3f0fee23-d3cc-7d90-a9b5-7ccb7d7bc6f4.png)
Fig.4　デバッグ中の画面

実行結果は「デバッグ / Linux Console」メニューから Linux Console を開いて確認できる。

![LinuxConsole2.png](https://qiita-image-store.s3.amazonaws.com/0/62802/17e0f15e-6772-f142-f786-27f7c8215f49.png)
Fig.5　デバッグコンソール画面


もう少し、プログラムらしいサンプルを以下に示す。これは常用対数の値を表示するものである。

```c++
#include <iostream>
#include <cmath>
 
using namespace std;
 
int main()
{
    cout << "Linux C++ test" << endl;
    double x = 1.0;
    double y;
 
    while (x <= 10.0) {
        y = log10(x);
        cout << "log10(" << x << ") = " << y << endl;
        x += 1.0;
    }
    return 0;
}
```
![LinuxConsole.png](https://qiita-image-store.s3.amazonaws.com/0/62802/8e3418d4-8d23-8f61-bfc8-4bf318223b22.png)
Fig.6　サンプルを実行したときのデバッグコンソール


#詳しい設定などについて

実行環境などの詳細な設定などについては、プロジェクトフォルダ内の readme / readme.html を参照するとよい。

 

#Linux 上での実行

Linux 側のホームディレクトリ (ユーザ名が user なら /home/user) に projects というフォルダが作成されて、その中にプロジェクトフォルダが作成される。そのフォルダをたどっていくと、実行ファイルができているのでそれを実行すると確かに正しく動作することを確認できる。

![ProjectsOnLinux.png](https://qiita-image-store.s3.amazonaws.com/0/62802/7e0278bc-cdb2-69c9-8be4-6fc07b931ed2.png)
Fig.7　Linux での実行例

#日本語を使う場合の問題点
日本語を使った場合、文字化けが起こってしまいました。(例えば、下記のソース)

```C++
#include <vector>
#include <string>
#include <iostream>

using namespace std;

//
//  Console2: vector テスト
//  =======================
//    日本語を使うときは、UTF-8 で保存すること。
int main()
{
    printf("Console2 : vector test!\n");

	vector<string> foods = { "パン", "チョコレート", "飴" };

	for (auto it = foods.begin(); it != foods.end(); it++)
	{
		cout << it->data() << endl;
	}

    return 0;
}
```

![Mojibake.jpg](https://qiita-image-store.s3.amazonaws.com/0/62802/749d573a-2737-86c6-fedb-3c0f2fff6bb5.jpeg)
Fig.8　実行例 (文字化けしたときとしないとき）

これは、このソースが Shift_JIS で保存されるため (Linux 側も) です。デフォルトで UTF-8 で保存できればいいのですが、オプションやプロジェクトのプロパティを探しても見つからなかったので、外部エディタで UTF-8 で保存しなおし（Windows 側) ビルドすると文字化けしなくなりました。

#Linux 側でのプロジェクトの場所
Linux 側のプロジェクトの場所はユーザ名が user 、プロジェクト名が ConsoleApp1なら

　/home/user/projects/ConsoleApp1

などとなります。実行ファイルは、

　/home/user/projects/ConsoleApp1/bin/x64/Release/ConsoleApp1.out

のように作成されます。

これは、プロジェクトのプロパティで容易に変更できます。

/