目次
そうだ、C/C++の環境を作ろう
こんにちは、novです。
最近、深層学習の勉強や仕事でPythonをよく触るのですが、性能の追求となってくるとやはりコンパイラ言語で実装したくなってきます。
プライベートで使用しているパソコンにはPythonの開発環境しか構築しておらず、C/C++で実装・勉強するとなるとその環境を作る必要がありました。
一応今までに
- Virtual BoxのUbuntu上の開発環境
- MinGWからgcc・g++をインストールして作成したVSCodeの開発環境
も作っていたのですが、それぞれ以下の問題点がありました。
- VirtualBoxの環境とWindowsの環境でデータのやり取りが面倒
- VirtualBoxのOSは、しばらく触っていないと起動しなくなることがある(原因不明)
- Windows上でコンパイルした実行ファイルは、セキュリティの例外に設定しないと実行できない(システムの問題)
どれも扱いが少々面倒だったんですよね…(ということで今までモチベも出ず)。
上記の問題を解決できる方法がないか調べたところ、WSL上のUbuntu環境を使用すれば良さそうということが分かりました。
というわけで、その環境を作ってみることにしました。
参考にしたサイトが競技プログラミング向けの環境構築だったりして、自分のやりたいことと少しずれているために色々とハマった部分もありました。
ということで自分の備忘録を兼ねてやり方をまとめておこうと思います。
なお、この記事は環境を構築し終わった後に細かい部分を確認しながら作っているので、もしかすると構築の際に抜けている要素があるかもしれません。
そこは適宜補っていただけると幸いです(もしご親切な方がいれば、コメントいただけると助かります)。
この環境でできること
Windows側のVSCodeからWSL環境にアクセスし、Linux環境でのC/C++開発が可能となります。
要件としては、以下のような感じになります。
・Windows側のVSCodeから簡単に起動できること
・WSLのファイルシステムだけではなく、Windows側のファイルシステム(Cドライブ以下)にもアクセスし、開発が可能なこと
・F5一発でビルド→デバッグ実行ができること
F5でビルド→デバッグという要件に関しては、Pythonのスクリプトを普段これで走らせていることもあって、同じように実行したいという思いから入れています。
(人によってはデバッグモードではなく普通に実行したいのかもしれませんが)
今回構築した環境での実行イメージはこんな感じです。
リモートエクスプローラーから「Ubuntu-18.04」にカーソルを合わせ、右クリックで「Connect to WSL」を選択
Remote WSLでUbuntuに接続したVSCodeのウィンドウが立ち上がる。
「ファイル」→「フォルダを開く」から、作業するフォルダを選択。
WindowsのCドライブへアクセスしたいときは、「/mnt/c…」というように選べばOK
例えば、デスクトップにアクセスしたいときは
「/mnt/c/Users/ [your user name] /Desktop」のようにしてアクセスすればよい。
「F5キー」を押すことで、ビルドとデバッグが可能
ブレークポイントを貼ることもできる
参考にしたサイトでは「/mnt/c 以下に入ると問題があるかも」と書かれていますが、現状特に困るようなことは起きていません。
構築環境の概要
上記環境の概要を図解すると以下のような感じになります。
Windows上で動くVSCodeから、Remote WSLを通して、WSLのUbuntu上で動くVSCodeにアクセスするイメージです。
また、Remote WSLにおいて「/mnt/c」へ移動することで、Windows上のファイルを編集・ビルドすることも可能です。図で表現すると以下のようなイメージですね。
今回の対象環境
構築手順
やるべき作業としては、以下のような流れになります。
- WSLの有効化
- WSL上で動かすLinux Distributionの入手
- WSL上のLinux環境に必要なソフトをインストール
- VSCodeの設定
WSLの有効化
WSLとはWindows Subsystem for Linuxの略です。仮想マシンやDockerと比較して軽量に動作するのが特徴です。
これを利用すると、以下のような感じで、LinuxのターミナルをWindows上で動かすことができます。
さて、この機能を利用するにあたっては、まずWSL機能を有効化する必要があります。
細かいやり方については以下の記事などを参照してください。
ただし、「Windowsの機能の有効化または無効化」の項目に関しては、環境によっては「Windows Subsystem for Linux」ではなく「Linux 用 Windows サブシステム」と表記されているかもしれないので注意です。
上記記事で紹介されている方ではこちら
項目の頭文字が違うので、見つからないって焦らないようにしましょう。
なお、設定を変更した際には再起動を要求されるのでご注意ください。
WSL Ubuntu上で行う作業
以下のコマンドを実行します。
sudo apt install build-essential -y
sudo apt install gdb -y
.code
上から順に、
- gcc、g++、makeなどのC/C++ソースコードをビルドするのに必要な実行ファイルのインストール
- デバッガgdbのインストール
- VSCodeのインストール
を行っています。
画面イメージはこんな感じです(既にインストールを終えた環境なのでこの画面では何もインストールされていません。実際はインストールしていいかどうかを問われるので、その時点で「y」を押して先に進みます)。
参考にしたサイトは以下です。
VSCodeをインストールしていない環境で「.code」を実行すると、最初はVSCodeのインストールが行われます。それが終わると、自動的にVSCodeのGUIが立ち上がります(後述するように、Remote WSLを使用した形での起動になります)。
参考にしたサイトにも言及がありますが、初回起動時にはいくつかの機能が自動でインストールされるため少し時間がかかります。
Windows側 VSCode拡張機能のインストール
VSCodeに関しては、すでにインストールが終わっているものとします。
今回導入する拡張機能は以下の通りです。
このRemote Development(特にRemote WSL)を使用して、WSL環境のVSCodeにアクセスすることになります。
WSL側 VSCode拡張機能のインストール
前述の通り、いくつかの機能は初回起動時に自動でインストールされます。
手動でインストールするのは以下の機能です。
上記の機能はWSL側にインストールする必要がないかもしれません。
念のためWindows側、WSL側の両方にインストールしているということになります。
WSL側のVSCodeの操作については、Remote WSLでつないだ状態で操作をすることと等価です。
VSCodeの左下に「WSL:Ubuntu-18.04」のような表示が出ていることを確認してから操作しましょう。
この時点での環境を起動する
2通りのやり方があります。
- WSL Ubuntuのターミナルを起動し、codeコマンドを実行
- VSCodeからリモートエクスプローラーを開き、「Ubuntu」の項目で右クリック → 別ウィンドウでRemote WSLにより起動
いずれも、Remote WSLでWSLのUbuntu環境にアクセスしたVSCodeのGUIが立ち上がります。
以下、画像つきで説明します。
1.について
WSLのUbuntuで立ち上げたターミナルで、「code」と打ちます。
VSCodeのウィンドウが立ち上がります。
立ち上がったウィンドウの左下に「WSL:Ubuntu18.04」と表示されていることを確認ください。
2.について
VSCodeを立ち上げ、「リモートエクスプローラー」を開きます(図中赤枠のアイコン)。
次に、リモートエクスプローラーに表示されている「Ubuntu-18.04」の上で右クリックし、「Connect to WSL」をクリックします。
立ち上がったウィンドウの左下に「WSL:Ubuntu18.04」と表示されていることを確認ください。
これでRemote WSLの環境作成は完了です。あとは、ビルドとデバッグの設定をすることで作成したかった環境が構築できます。
ビルドとデバッグの設定
この時点で、Remote WSLを使用して任意のフォルダにアクセスすることはできるはずです。あとは、「Ctrl+Shift+B」でビルド、「F5」でビルド+デバッグができるように設定していきます。
とはいえ、とりあえず動かすだけなら以下の手順をやるだけでOKです。
- ビルドしたいファイルをVSCode上で開く
- F5を押して、画面上部に出てきたプルダウンメニューのうち、「C++(GDB/LLDB)」をクリックする
- さらに表示されるメニューのうち、「g++ アクティブファイルのビルドとデバッグ(コンパイラ /usr/bin/g++)」を選択する
こうすると、現在編集中のフォルダ以下に「.vscode」フォルダが作成され、その中に「tasks.json」と「launch.json」が作成されます。
簡単なcppファイルのビルドだけなら特に編集する必要もありません。
また、tasks.jsonが生成されている時点で「Ctrl+Shift+B」を押すことでビルドが可能です。
なお、tasks.jsonはビルドに関係するオプション等を設定するファイル、launch.jsonはデバッグに関する設定をするファイルです(厳密には違うかもしれませんが、大筋はそう認識していればいいと思います)。
英語ですが、公式のドキュメントを参照するのもいいかもしれません。
今回の環境構築は以上で終了です。
実際にビルド・デバッグを試す
冒頭でもざっくり触れましたが、この環境でビルド・デバッグの動作を確認してみます。
サンプルコードは下記のように「Hello World!」をコンソールに表示するものとします。
@import “vscode_remote_wsl6.png”
適当なフォルダに移動し、hello.cppとして以下のようなファイルを作成します。
#include <iostream>
using namespace std;
int main()
{
cout << "Hello World!" << endl;
return 0;
}
作成したら、適当なところにブレークポイントを貼り、F5キーを押します。以下のように、ビルドタスクが走り、コンソールに「Hello World」と表示されたらOKです。
Hello World!が表示されないときは、開いているコンソールの種類が違うかもしれません。ターミナル右上のプルダウンメニューから、「cppdbg:hello」を選択すれば期待した結果になっているはずです。
これでC/C++をWSL上で動かす環境が構築できました。
Cドライブのファイルにもアクセスできるので、実質Windows上で開発しているも同然です。
やったね!
注意点
この環境で、Cドライブ以下のフォルダで作業する際に1点だけ注意点があります。
MinGWのgcc/g++コンパイラを用いてビルドを行う設定をしている「.vscode」フォルダがある場合、そのフォルダではWSL側のコンパイラをうまく認識してくれない現象が起きていました。
いまいちこの原因はわかっていないので、WSLの環境を用いて開発を行うときは、別途フォルダを作成してから行うことをオススメしておきます。
まとめ
今回はWSLとVSCodeのRemote WSLの機能を用いてWindows上にC/C++の開発環境を構築する方法をまとめました。
自分の備忘録的なところがありますが、イチから構築する方法をまとめたつもりです。
同じような環境を構築したい人の参考になればと思います。
コメント