WSL2とVSCodeでC++環境構築した(AtCoder Libraryを使えるようになるまで)
Pythonで競プロをしていたけれど,AtCoderにてC++限定でAtCoder Library(ACL)が提供されたため,C++とPythonとついでにRustを書けるように環境構築しました.環境構築について詳しいわけではないですが,誰かの役に立つかもしれないと思ったのでメモを残しておきます.
想定読者はVScodeを使ってPythonなどC++以外の言語で競プロをしてたけど,C++の環境を作りたいWindowsユーザーです.ただ,WSL2でACLを使えるようにしたい!みたいなC++使いの人でも参考になるかもしれません.
WSL2を使えるようにするまでは他記事を見に行った方が親切に書かれています.一応ざっくりとは書きました.また,僕が参考にした記事や,これとは違うことがしたくて,dockerで楽にやりたいぜ!って人へのオススメ記事はこの記事の最後に貼っておきます.
既にVScodeを使ってて,WSLも入っててPythonを書いている人はC++を書けるようにするあたりから読むといいかもしれません. Pythonじゃなくて既にC++を使ってるけど,ACLが導入したいぜ!って人はACLを使えるようにする前後から読むといいかもしれません.
- Visual Studio Codeをインストールする
- WSL2を使えるようにする
- gccをインストールする
- VScodeでC++を書けるようにする
- tasks.jsonを編集する
- ACLを使えるようにする
- (おまけ)C++が自動整形されるようにする
- オススメ記事や参考記事
Visual Studio Codeをインストールする
僕はVScodeを用いて競プロをしていたので入っています.
入ってない人は
公式からインストールしましょう. インストールが失敗したらzipファイルを解凍して使えるようにするなどの方法もあるみたいなので困ったら下のリンクを見に行ってください.Qiitaとかで「vscode インストール」などと検索するのもいいかもしれません.
WSL2を使えるようにする
MicrosoftのWSL2インストールガイドを見ます.
Windowsのバージョンがバージョン 1903 以降、ビルド 18362以上でないと書かれているので,設定>システム>バージョン情報を確認します.
OK!
OKでなかった人はアップデートしましょう.自動更新が来てなければ手動で更新しましょう. Windows 10 May 2020 Updateというやつです.
次に2個,Windowsの機能の有効化をします. ドキュメントに書かれているようにpowershellを管理者権限で開いて,コマンドを2個打てばいいです.
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
もしくは,コントロールパネル>プログラム>Windowsの機能の有効化または無効化を開いて, Linux用Windowsサブシステムと,仮想マシンプラットフォームのところを有効にすればいいです(ここは言語が英語になっていることもあった気がします).コマンドを打つのとやっていることは変わりません.
と
の2個です.
ここまでやって,再起動するとWSL2がインストールされたと思います.
再起動したら
wsl --set-default-version 2
をpowershellで実行しましょう.WSLの既定のバージョンを2とします.
そして,Microsoft Storeを起動し,Ubuntuと検索しましょう.何個か出てきた中でUbuntu20.04を入れます(僕は18.04やバージョンのついていないモノとの違いが分かっていません,新しい方がよさそう!と気持ちで20.04を入れています.気になる人は調べるといいでしょう).
インストールしたら起動してみましょう.ストアのページを閉じたりして見失った人は検索窓に打ち込めば出てきます.
始めに起動すると,ユーザ名とパスワードの入力を求められたはずです.うろ覚えですが.僕はユーザ名をntkにしておけばなあ,と悔やんでいます.適切につけましょう.
gccをインストールする
Ubuntuを起動しておいて,いろいろ入れましょう.
sudo apt update sudo apt upgrade
をまずします.
それから次のコマンドを打って,gccを入れましょう.
apt install gcc-9 g++-9
続きのことは好きなものがあれば入れてください.
(任意)次にPythonとpipを入れる.numpyとかを入れる.PyPyも入れる.
apt install python3.8 python3-pip python3.8 -m pip install -U Cython numba numpy scipy scikit-learn networkx apt install pypy3
(任意)さらにRustを入れる.
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
Rustはこの後に
Install Rust - Rust Programming Language
にあるように,パスを設定する必要があります.
g++-9 --version python3 --version PyPy --version rustc --version
などを打って,入れたもののバージョンが表示されていたら成功です.
VScodeでC++を書けるようにする
VScodeとWSL2が入っていて,Pythonで今まで競プロをしてたよ!って人はここらへんから本題な気がします.前節でgccなどを入れたので(入れてない人は上の方にスクロールして入れてください!),VScodeでC++ファイルを作って,コンパイルして実行することはできるはずです.
VScodeを立ち上げます. WSL環境で作業するので,よさげな拡張機能Remote-WSLを使います. これを使わなくてもターミナルの既定のシェルを変更すれば作業できそうですが,ここではRemote-WSLを使います.
あとC++を使うので,C/C++の拡張機能も入れておきましょう.
左下の><みたいなやつをクリックして,Reopen Folder in WSLなどを選ぶとウィンドウが開くのでそこで作業をしましょう.
新しいウィンドウでは左下がWSL: Ubuntu-20.04などと表示されていると思います.
ctrl + shift + P を打ってコマンドパレットを開きましょう.C++の設定をするためにC/C++ edit configurationsと打ってJSONのものを選ぶと,設定ファイルが開くと思います.c_cpp_properties.jsonという名前のファイルです.下のように書くと,C++の補完とかが効くようになると思います.
{ "configurations": [ { "name": "WSL", "includePath": [ "${workspaceFolder}/**", "/usr/include/**" ], "defines": [ "_DEBUG", "UNICODE", "_UNICODE" ], "compilerPath": "/usr/bin/gcc-9", "cStandard": "c11", "cppStandard": "c++17", "intelliSenseMode": "gcc-x64" } ], "version": 4 }
さっそくC++ファイルを書いて,コンパイルして実行してみましょう. ターミナルはctrl + shift + @で起動できます.
g++-9 (ファイルの名前) -std=gnu++17 -o (実行ファイルの名前)
のようにできます.g++-9 をg++にしている人もいるかもしれません(切り替えたい人はupdate-alternativesをするといいかもしれません).-std=gnu++17はc++17の機能を使えるようにしています(参考:処理系 - cpprefjp C++日本語リファレンス). -o (ファイルの名前)で実行ファイルの名前を決められます.
3枚下の画像では
g++-9 test.cpp -std=gnu++17 -o test
としています.他にもいろいろなコンパイルするときのオプションがつけられます.とりあえずこのままコンパイルしてみましょう.testというファイルができたはずです.エクスプローラーのところを更新して確認するか,lsコマンドを打てばいいです.
ファイルができたら実行してみましょう. ./test と打てば実行できます.
できました.<bits/stdc++.h>もincludeできていてよかったです.
tasks.jsonを編集する
tasks.jsonを編集すると,コンパイルがctrl + shift + B でできるようになります.C++を使うときはいろいろコンパイラオプションをつけたくなりますが,いつも打つのは面倒なので書いちゃいましょう.
上のバーからターミナルを押して,既定のビルドタスクを構成しましょう.うろ覚えですが,g++ ほにゃららとか書いてるのを選ぶと(全然違う感じで出てくるかもしれません.すみません),tasks.jsonというファイルが開くと思います.
開いたら次のように書くといいです.オプションは僕が使ってるやつも含めています.1
{ "version": "2.0.0", "tasks": [ { "type": "shell", "label": "C/C++: g++-9 compile file", "command": "/usr/bin/g++-9", "args": [ "-std=gnu++17", "-Wall", "-Wextra", "-Wshadow", "-Wconversion", "-fsanitize=undefined", "-ggdb", "${file}", "-o", "${fileDirname}/${fileBasenameNoExtension}" ], "problemMatcher": [ "$gcc" ], "group": { "kind": "build", "isDefault": true } } ] }
これを保存して,C++ファイルを開き直してctrl + shift + Bでコンパイルしてみましょう.できなかったらウィンドウを開き直すとできると思います(たぶん).
ACLを使えるようにする
AtCoder Libararyを使えるようにしましょう. 持ってない人はまず
からダウンロードしましょう. 解凍して作業ディレクトリにac-libraryを持ってきましょう.2 そしてこれを使ってコンパイルしたりこれの補完を効かせるためには,c_cpp_properties.jsonとtasks.jsonを書き換えるといいです.
まずc_cpp_properties.jsonからです.includePathを足してあげましょう.ac-libraryのパスを書いてあげればいいです.// 以降のコメントは消していいです.
{ "configurations": [ { "name": "WSL", "includePath": [ "/mnt/c/Users/ntk/Documents/AtCoder/ac-library/", // 書き足すところ!!!!! "${workspaceFolder}/**", "/usr/include/**" ], "defines": [ "_DEBUG", "UNICODE", "_UNICODE" ], "compilerPath": "/usr/bin/gcc-9", "cStandard": "c11", "cppStandard": "c++17", "intelliSenseMode": "gcc-x64" } ], "version": 4 }
上は僕の環境のパスを書いてますが,自分のに書き換えてください.パスがわからない人は,
と,ac-libraryのところで右クリックをするとパスのコピー,が出てくるのでこれを貼るといいです.
次にtasks.jsonですが,
{ "version": "2.0.0", "tasks": [ { "type": "shell", "label": "C/C++: g++-9 compile file", "command": "/usr/bin/g++-9", "args": [ "-std=gnu++17", "-I", //書き足すところ "/mnt/c/Users/ntk/Documents/AtCoder/ac-library/", //書き足すところ "-Wall", "-Wextra", "-Wshadow", "-Wconversion", "-fsanitize=undefined", "-ggdb", "${file}", "-o", "${fileDirname}/${fileBasenameNoExtension}" ], "problemMatcher": [ "$gcc" ], "group": { "kind": "build", "isDefault": true } } ] }
と足しましょう."-I"はそのままで,次の行はさっきと同じac-libraryのあるパスを書きましょう. これで,#include <atcoder/all>とかができるようになったはずです. C++ファイルで <atcoder/all>をincludeして,atcoder::と打った後にctrl + spaceを押したり,コンパイルしましょう.補完が出て,コンパイルもできたら成功です. なにかできなかったらウィンドウをリロードしてみるといいかもしれません(これよくわかってないんですけど,tasks.jsonを書き換えた後に開き直さないと変更が適用されてなさそうなんですよね,自分だけかもしれませんが).
できたら終わりです.お疲れさまでした.
(9/10 追記) AtCoderで提出するときに言語切り替えが必要です.忘れないようにしましょう.
(10/16 追記) 切り替えなくてよくなったそうです.
(おまけ)C++が自動整形されるようにする
C++を保存したときに自動整形されるようにしたいです. またctrl + shift + P を打ってコマンドパレットを開いてsettingと打ち,設定を選びましょう. 設定の入力にformat on saveと打つと,ファイルを保存したときにフォーマットしてくれるようになります.
さらに調整したい人は,Clang-Format拡張機能を入れましょう.
そして.clang-formatファイルを作り,細かい設定を書き込むといいと思います. 設定については公式を見るといろいろ変更できることがわかります.
Clang-Format Style Options — Clang 12 documentation
僕のは下の感じです.
BasedOnStyle: Google IndentWidth: 4 AccessModifierOffset: -4 AllowShortCaseLabelsOnASingleLine: true AllowShortFunctionsOnASingleLine: InlineOnly AllowShortIfStatementsOnASingleLine: true ColumnLimit: 120 BreakBeforeBraces: Custom BraceWrapping: BeforeElse: false AlwaysBreakTemplateDeclarations: No PointerAlignment: Right IncludeBlocks: Merge
あとはこれが適用されるように,設定を書き換えます.コマンドパレットから設定を開いて,clang-format:executableと検索しましょう.あとは.clang-formatファイルのパスを貼ればいいです.
(TODO!)
launch.jsonについても書く.デバッガを使えると便利です.
Online judge Toolsとか便利そうですよね.僕もまだ導入していません.
オススメ記事や参考記事
環境変数に書きたい人向け.
参考にしました.
Dockerで楽にやりたい人向けです.
Dockerで,なんかなんでも入ってそうな感じです.