2020/05/19

WSLのUbuntuとgccをアップグレードした(備忘録)

WSL(Windows Subsystem for Linux)をアップグレードしたので、その備忘録。

そもそもの発端は、atcoder.jp が主催する競技プログラミングの問題で最大公約数を算出する際の関数「gcd」が、c++17で加わったという話を聞いて、ずっとc++11を使ってきたが、そろそろ17にしようかなと思ったこと。競プロ用には、gcd は実装も容易で、自前ライブラリに入れてあるのでそれをコピペすれば十分なのですが、せっかく標準のがあるのならそれを使わない手はないし、それも含めて新しいライブラリを使えるようにしていこうと思って。

さて、私がatcoderに参加するときの手元の環境は、
  • エディタ = Visual Studio
  • コンパイラ = g++/WSL Ubuntu
  • テスト実行 = WSL Ubuntu Console
VSでコードを書き、そのコードをWSLコンソールにてg++でコンパイルしてテストを実行しています。以前はatcoder内のコードテストを使っていたのですが、コンパイルや実行が遅いことがたまにあって、デバッグで何度もコンパイルと実行を繰り返すならローカルの方が便利。VSの中でコンパイルから実行までできてもいいのですが、標準入力にデータを入れるのがちょっと面倒なので、WSLでコンパイルとテストをしています。

で、gcdが入っているコードを実行しようとしたところ、コンパイルエラーが出てしまい、調べたらgccのバージョンが古い。これをアップグレードしなければならないのだけれど、apt-getでは入ってこないし、ググると、gccだけアップグレードするのはなかなか大変そう。

だったら、Ubuntuごとアップグレードすれば?ということで、Microsoft Storeをのぞいてみたところ、Ubuntu 20が最新版で上がっていました。これをインストールし、gccもインストールしてバージョンを確認したところ、g++9まで上がっていました。もちろん、std=c++17も無事使えました。

ところで、このアップデート中にちょっと気になったところをいくつか備忘録で。

ひとつは、WSLのバージョンについて。

WSLにはWSL1とWSL2があって、WSL1とUbuntu20は相性が悪いよ、という記事(「(今はまだ)WSL1にUbuntu 20.04を入れるな」)を見つけたので、今使っているWSLのバージョンを確認しようとしたところ、いろんな記事で書かれている「PowerShellで、wsl -l -v」が実行できない。似たようなコマンドオプションは、「wsl -l」で、これによってインストールされているUbuntuが表示され、どちらが既定になっているかが表示されるものの、「wsl -l -v」の結果としていろんな記事で示されている、WSLのバージョンナンバーが出てこない。Windows Updateしろとか、PowerShellのアップデートをしろとかいろいろあったけれども、どれも不発。なんだろう?結局わからずじまいで、WSLのバージョンもわからず。作業中、PowerShellのバージョンを調べる方法も記事によってまちまちで、MSはこういうとこだぞ、と内心思いつつ。その点、Linuxは大体どれも同じような書式だったり、ググって出てきた記事がだいたいあてはまったり、オプションもだいたい似たような書式で、--version と書いておけばversionが見られたりするのでいいですね。まあ、普段はエンジン開発のテストくらいでしか使わないし(本チャンはクラウドのインスタンスを使うので)、あとは競プロなので、g++のコンパイルさえできればあまり問題がないかな・・・。

次に、Ubuntuの選択について。

Ubuntu20を入れると、前のUbuntuが消えるわけではなくて、別環境としてインストールされました。ので、旧Ubuntuの環境も引き続き残っています。ホームディレクトリなども別々なので、先のUbuntuでいろいろ整備した環境は、もう一度作り直す必要があります。といっても私の場合は、gcc, vim, screenくらいしか使わないのですが。

で、Shift+右クリックのコンテキストメニューに「Linuxシェルをここにひらく」があるのですが(注:人によってはこのメニューがない方もいらっしゃるそうで、めちゃめちゃ使いやすいのでぜひ入れた方がいいです。ただ、入れ方は知りません。)、これで立ち上がるUbuntuが、上のwslコマンドで現れた「既定」のUbuntuになりました。既定の変更は「wsl -s」で可能。

PS C:\Users\username\Desktop> wsl -l
Windows Subsystem for Linux ディストリビューション:
Ubuntu-20.04 (既定)
Ubuntu
PS C:\Users\username\Desktop>

こんな感じ。用途によって選んで使うと便利そうです。