newbie hhyuga

情報系の学生です。プログラミング、情報セキュリティに興味があります。

C/C++開発環境がWSL上にあり、エディットをGUI(VSCode)で行う方法

概要

WindowsユーザがLinux環境でC/C++開発したいとき、
以前は仮想マシンを立ち上げてそのうえでLinuxを動かすことが多かったが、
最近はWindows Subsystem for Linux(WSL)上にUbuntu等をインストールしてLinux環境を整えることができるようになった。
このとき、エディタはVim等のCUIではなく、VSCodeなどのGUIで開発したいときは、主に2通りの手段がある。

Windows上にX Serverを、WSLにはX Clientをインストールして、Windows上にVSCodeのウィンドウを表示させて開発。
Windows上からWSL上のファイルを直接エディットする。

本記事では②の方法のやり方を述べる。
もちろん、補完機能などもちゃんと動作するようにする。

実行環境

OS: Windows 10
VSCode Ver: 1.24.1
C/C++ for Visual Studio Code Ver: 0.17.5

必要なソフトウェアのインストール

VSCodeのインストール

C/C++拡張機能をインストール

ワーキングディレクトリを開く

エディットしたいファイルがWSL上にある場合

WSL上のファイルは、

C:\Users\%USERNAME%\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs

の中にある。
もしかしたら「_79rhkp1fndgsc」の部分が環境によって異なるかもしれないが、読み替えてほしい。
エディットしたいファイルがあるディレクトリにたどり着いたら、そのフォルダをWindows上のVSCodeで開く。

エディットしたいファイルがWindows上にある場合

エディットしたいファイルがあるフォルダをそのままWindows上のVSCodeで開く。

C/C++拡張機能の設定を変更

ここを参考に設定ファイルを書き換える。
設定ファイルは、Ctrl + Shift + Pでコマンドパレットを開き、「C/Cpp: Edit Configurations...」を選択することで編集できる。

{
    "configurations": [
        {
            "name": "WSL",
            "intelliSenseMode": "clang-x64",
            "compilerPath": "/usr/bin/gcc",
            "includePath": [
                "${workspaceFolder}",
                "/usr/local/include",
                "/usr/include"
            ],
            "defines": [],
            "browse": {
                "path": [
                    "${workspaceFolder}"
                ],
                "limitSymbolsToIncludedHeaders": true,
                "databaseFilename": ""
            },
            "cStandard": "c11",
            "cppStandard": "c++17"
        }
    ],
    "version": 4
}

右下にこのマークが出るはずなのでしばらく待つ。5分経っても変化がない場合は、VSCodeを再起動してみる。
f:id:hhyuga201515:20180630091105p:plain

確認

ちゃんとWSL上のインクルードファイルを参照していることがわかる。 f:id:hhyuga201515:20180630092957p:plain f:id:hhyuga201515:20180630092912p:plain

コンパイル

Windows上でターミナルを開いて、

$ bash
または
$ ubuntu -c bash

でWSLのコマンドラインを開き、gcc/g++等使ってWSL上でエディットしたファイルをコンパイルし、実行すればよい。