Visual Studioを最新にアップデートしたところ、Linux開発がうまく出来なくなってしまいました。解決策を発見しましたので一から解説します。

Visual StudioでLinux開発

Visual Studioでは2017版からLinux開発がデフォルト機能として正式サポートされています。 ちゃんとブログ記事などにも操作方法が紹介されているのですが、問題はこのドキュメントが古いこと!最新のVSではコード補完が上手く動作せず使い物になりません。

最新(v15.7)の変更事項1: プロジェクトファイルの内容が変わった!

古いプロジェクトファイルは最新のVSでは動きません。 これまでに作ったプロジェクトファイルは諦めて、一からプロジェクトを作り直すことにしました。空のプロジェクトを作ると、Makefileを含む様々なビルドシステムを選択できます。Makefileプロジェクトにすると設定内容が大きく変わるので、Makefileを使うなら初めからそうしましょう。

予想ですが、将来的には一つのプロジェクトでWindowsとLinux開発の両方を行えるようにしているのだと思います。特殊なプロジェクトとして扱われていたLinuxプロジェクトが、変更を経て徐々に普通のプロジェクトファイルに近付きつつあります。期待しましょう!

最新(v15.7)の変更事項2: ヘッダーファイルのキャッシュ

最新のブログ記事によると、このバージョンからはVS付属のヘッダファイルだけでなく、実行先のマシンのヘッダーファイルをキャッシュしてIntellisenseで使えるようになりました。

ここまでは良いのですが、すべて手動で設定しなくてはいけません。これまでに使えていたデフォルト補完がなくなり、#include <iostream>などがすべてエラーになります。正しい設定方法は以下の3ステップです。

キャッシュを転送

ボタンを辿って、以下のページを表示して下さい。
[ツール]→[オプション]→[クロスプラットフォーム]→[接続マネージャ]→[リモートヘッダ]→[IntelliSenseマネージャ]

sudo apt install zipコマンドの実行がクライアント側で必要になるかもしれません。クライアント側の設定は以前のものにしたがって下さい。

キャッシュのダウンロードが終わると、内容が閲覧できます。「探索」ボタンで表示してみましょう。以下のようなパスに保存されているはずです。

C:\Users\NAME\AppData\Local\Microsoft\Linux\Header Cache\1.0\-1204525716

デフォルトインクルードパスを取得

クライアントでgcc -xc++ -v -を実行して下さい。以下のようにデフォルトインクルードパスが表示されるはずです。

$ gcc -xc++ -v -
...
#include <...> search starts here:
 /usr/include/c++/6
 /usr/include/x86_64-linux-gnu/c++/6
 /usr/include/c++/6/backward
 /usr/lib/gcc/x86_64-linux-gnu/6/include
 /usr/local/include
 /usr/lib/gcc/x86_64-linux-gnu/6/include-fixed
 /usr/include/x86_64-linux-gnu
 /usr/include
End of search list.

Ver15.7ではこれらのパスが自動設定されないので、IntelliSenseに教えてあげる必要があります。 /usr/include/c++/6C:\Users\NAME\AppData\Local\Microsoft\Linux\Header Cache\1.0\-1204525716\user\include\c++\6にキャッシュされています。すべてWindows側のパスに直してメモ帳にでもまとめて下さい。

プロジェクトファイルに設定

ソリューションエクスプローラ内からプロジェクトを右クリックすると、以下のようなプロパティページを表示できます。 [C/C++]→[インクルードの検索パス]に先ほど作ったパスをすべて入力して下さい。;で区切れます。

これでようやく補完がまともに働きます。

おわりに

少しずつ改善が進んでいて喜ばしいのですが、急に仕様を変えてドキュメントも無いのは酷いと思いました。MSにはその辺りも頑張ってほしいものです。