Open2

windows + wsl (ubuntu) に atcoder library の導入

eoeo_oooeoeo_ooo

AtCoderではC++用のライブラリ atcoder library が使えます.この記事では windows + wsl (ubuntu) 環境に atcoder library を導入することを目標にします.

やること

  • atcoder library のフォルダをubuntuの作業フォルダ直下に移す.
  • コンパイラオプションでatcoder libraryのパスを指定する.
  • コンパイラオプションを含めたコマンドをエイリアスに指定する.

atcoder library のフォルダをubuntuの作業フォルダ直下に移す.

atcoder library のダウンロード

まず,atcoder library を以下のリンクからダウンロードします."zip" のリンクをクリックするとダウンロードできます.
https://atcoder.jp/posts/517

windowsのダウンロードフォルダに ac-library.zip フォルダがあるので右クリックして "すべて展開" -> "展開(E)" を押します.

zipと付いていないフォルダができていればよいです.

ac-library フォルダを競プロ用の作業フォルダに移す.

ここからは ubuntu のターミナルから操作します.windowsのアプリから Ubuntu on Windows を立ち上げます.windows側のフォルダをコピーして,wsl (ubuntu) 側の作業フォルダ直下に移すことを目指します.

まずはwindows側のUsersフォルダにアクセスします.以下のコマンドを実行します.

cd /mnt/c/Users

次にあなたのユーザーフォルダにアクセスします.以下のコマンドを実行してみてください.

ls

ls を実行すると現在のフォルダの中にあるファイルとフォルダの一覧が確認できます.Usersフォルダの中にあなたのwindows側のユーザー名が見つかるはずです.ユーザー名のフォルダにアクセスします.以下のコマンドを実行します.

cd (あなたのwindowsユーザー名)

ac-libraryフォルダはその下のDownloadsフォルダの中にあります.以下のコマンドを実行します.

cd Downloads

ls を実行して ac-library フォルダが確認できれば成功です.
wsl側にac-libraryフォルダをコピーして移します.コピーは以下のコマンドでできます.
wsl側の作業フォルダは大体ホームディレクトリ直下に ~/atcoder のように作成しているはずです.特に,私と一緒に環境構築をした場合は ~/atcoder が (あなたのwsl側の作業フォルダのパス)です.ちなみに ~/ は /home/(user名)/ の略です.

cp -r ac-library (あなたのwsl側の作業フォルダのパス)/ac-library

私の場合は ~/atcoder がwsl側の作業フォルダのパスなので以下を実行します.

cp -r ac-library ~/atcoder/ac-library

コンパイラオプションでパスを指定する.

.bashrc にエイリアスを設定する.

atcoder library を使うにはコンパイラオプションで次のようにac-libraryフォルダへのパスを指定する必要があります.

g++ main.cpp -std=c++17 -I /atcoder/ac-library

これは面倒なのでショートカットを設定して

g main.cpp

とコンパイルできるようにします.

wsl (ubuntu) のターミナルを起動して次を実行します.

code ~/.bashrc

VScodeが立ち上がって .bashrc ファイルが開かれます..bashrc にはいろいろな設定が書けます.大切はファイルなので元から書いてある部分をむやみに触らないようにします.

.bashrc に以下を追記してください.g が = の右側の "(たくさん書いてあるやつ)" のショートカットになる,という意味です.ただし,(wsl側の atcoder library へのパス)の部分は各自書き換えてください.

alias g="g++-9 -O0 -std=gnu++17 -Wall -Wextra -Wconversion -Wshadow -Wfloat-equal -ftrapv -fsanitize=undefined,address -fno-omit-frame-pointer -fno-sanitize-recover -g -I (wsl側の atcoder library へのパス)"

私の場合は,~/atcoder/ac-library が atcoder library のパスなので次のようになります.

alias g="g++-9 -O0 -std=gnu++17 -Wall -Wextra -Wconversion -Wshadow -Wfloat-equal -ftrapv -fsanitize=undefined,address -fno-omit-frame-pointer -fno-sanitize-recover -g -I ~/atcoder/ac-library"

以下の148行目のようになっていればよいです.

おまけに私が使っているコンパイラオプションをたくさんつけておきました.例えば "-fsanitize=undefined,address -g"を指定すると,配列外参照をしたときにコードのどの部分で配列外参照が起きているか分かるようになります.

エイリアスを追記したら ctrl + s を推してファイルを保存します.それからターミナルを再起動すると

g main.cpp

のようにコンパイルができるようになっているはずです.試しに以下のコードをコンパイルしてみてください.

#include <bits/stdc++.h>
using namespace std;

#include <atcoder/modint>
using namespace atcoder;

using mint = modint1000000007;

int main() {
    mint a = 10;
    a += 1000000000;

    cout << a.val() << endl;
    // a.val() = 3
}

modintが正しく動いていれば上のコードを実行すると "3" が出力されるはずです.

お疲れさまでした

上手くいかなかったら教えてください.

eoeo_oooeoeo_ooo

sudo apt install g++-9 を実行する必要があるようです。