ntk log ntk

競プロや非競技プロのやったことを書いています.

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をインストールする

僕はVScodeを用いて競プロをしていたので入っています.

入ってない人は

code.visualstudio.com

公式からインストールしましょう. インストールが失敗したらzipファイルを解凍して使えるようにするなどの方法もあるみたいなので困ったら下のリンクを見に行ってください.Qiitaとかで「vscode インストール」などと検索するのもいいかもしれません.

code.visualstudio.com

WSL2を使えるようにする

MicrosoftのWSL2インストールガイドを見ます.

docs.microsoft.com

Windowsのバージョンがバージョン 1903 以降、ビルド 18362以上でないと書かれているので,設定>システム>バージョン情報を確認します.

f:id:ntk_ta01:20200908101650p:plain

OK!

OKでなかった人はアップデートしましょう.自動更新が来てなければ手動で更新しましょう. Windows 10 May 2020 Updateというやつです.

www.microsoft.com

次に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の機能の有効化または無効化を開いて, LinuxWindowsサブシステムと,仮想マシンプラットフォームのところを有効にすればいいです(ここは言語が英語になっていることもあった気がします).コマンドを打つのとやっていることは変わりません.

f:id:ntk_ta01:20200908103633p:plain

f:id:ntk_ta01:20200908103751p:plain

の2個です.

ここまでやって,再起動するとWSL2がインストールされたと思います.

再起動したら

wsl --set-default-version 2

powershellで実行しましょう.WSLの既定のバージョンを2とします.

そして,Microsoft Storeを起動し,Ubuntuと検索しましょう.何個か出てきた中でUbuntu20.04を入れます(僕は18.04やバージョンのついていないモノとの違いが分かっていません,新しい方がよさそう!と気持ちで20.04を入れています.気になる人は調べるといいでしょう).

インストールしたら起動してみましょう.ストアのページを閉じたりして見失った人は検索窓に打ち込めば出てきます.

f:id:ntk_ta01:20200909171413p:plain

始めに起動すると,ユーザ名とパスワードの入力を求められたはずです.うろ覚えですが.僕はユーザ名を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

などを打って,入れたもののバージョンが表示されていたら成功です.

VScodeC++を書けるようにする

VScodeとWSL2が入っていて,Pythonで今まで競プロをしてたよ!って人はここらへんから本題な気がします.前節でgccなどを入れたので(入れてない人は上の方にスクロールして入れてください!),VScodeC++ファイルを作って,コンパイルして実行することはできるはずです.

VScodeを立ち上げます. WSL環境で作業するので,よさげな拡張機能Remote-WSLを使います. これを使わなくてもターミナルの既定のシェルを変更すれば作業できそうですが,ここではRemote-WSLを使います.

f:id:ntk_ta01:20200908123637p:plain

あとC++を使うので,C/C++拡張機能も入れておきましょう.

f:id:ntk_ta01:20200909173434p:plain

左下の><みたいなやつをクリックして,Reopen Folder in WSLなどを選ぶとウィンドウが開くのでそこで作業をしましょう.

新しいウィンドウでは左下がWSL: Ubuntu-20.04などと表示されていると思います.

f:id:ntk_ta01:20200908124324p:plain

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 + @で起動できます.

C++コンパイル

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コマンドを打てばいいです.

f:id:ntk_ta01:20200910225700p:plain

f:id:ntk_ta01:20200910225759p:plain

ファイルができたら実行してみましょう. ./test と打てば実行できます.

f:id:ntk_ta01:20200908124949p:plain

できました.<bits/stdc++.h>もincludeできていてよかったです.

tasks.jsonを編集する

tasks.jsonを編集すると,コンパイルがctrl + shift + B でできるようになります.C++を使うときはいろいろコンパイラオプションをつけたくなりますが,いつも打つのは面倒なので書いちゃいましょう.

上のバーからターミナルを押して,既定のビルドタスクを構成しましょう.うろ覚えですが,g++ ほにゃららとか書いてるのを選ぶと(全然違う感じで出てくるかもしれません.すみません),tasks.jsonというファイルが開くと思います.

f:id:ntk_ta01:20200909161937p:plain

開いたら次のように書くといいです.オプションは僕が使ってるやつも含めています.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
            }
        }
    ]
}

f:id:ntk_ta01:20200909175933p:plain

これを保存して,C++ファイルを開き直してctrl + shift + Bでコンパイルしてみましょう.できなかったらウィンドウを開き直すとできると思います(たぶん).

ACLを使えるようにする

AtCoder Libararyを使えるようにしましょう. 持ってない人はまず

atcoder.jp

からダウンロードしましょう. 解凍して作業ディレクトリに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
}

上は僕の環境のパスを書いてますが,自分のに書き換えてください.パスがわからない人は,

f:id:ntk_ta01:20200909163605p:plain

と,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を書き換えた後に開き直さないと変更が適用されてなさそうなんですよね,自分だけかもしれませんが).

f:id:ntk_ta01:20200909164122p:plain

できたら終わりです.お疲れさまでした.

(9/10 追記) AtCoderで提出するときに言語切り替えが必要です.忘れないようにしましょう.

f:id:ntk_ta01:20200910214828p:plain

(10/16 追記) 切り替えなくてよくなったそうです.

https://atcoder.jp/posts/535

(おまけ)C++が自動整形されるようにする

C++を保存したときに自動整形されるようにしたいです. またctrl + shift + P を打ってコマンドパレットを開いてsettingと打ち,設定を選びましょう. 設定の入力にformat on saveと打つと,ファイルを保存したときにフォーマットしてくれるようになります.

f:id:ntk_ta01:20200908125416p:plain

さらに調整したい人は,Clang-Format拡張機能を入れましょう.

f:id:ntk_ta01:20200909174257p:plain

そして.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ファイルのパスを貼ればいいです.

f:id:ntk_ta01:20200909174533p:plain


(TODO!)

  • launch.jsonについても書く.デバッガを使えると便利です.

  • Online judge Toolsとか便利そうですよね.僕もまだ導入していません.

オススメ記事や参考記事

環境変数に書きたい人向け.

bakamono1357.hatenablog.com

参考にしました.

qiita.com

qiita.com

Dockerで楽にやりたい人向けです.

scol.hatenablog.com

Dockerで,なんかなんでも入ってそうな感じです.

github.com


  1. オプション,C++に移行したばかりでよくわかってなくてオススメがあれば教えてください

  2. 僕はwindowsのフォルダで作業しているのでダウンロードしたフォルダも簡単に移動させることができましたが,WSLの方にフォルダを移動させたい人もいますか?cpコマンドを使うか,ubuntuを起動してexplorer.exe . を打ってフォルダを移動させるといいかもしれません.