C++ 環境構築 (mac, VSCode 他) で躓いた点と解決法の記録

こんにちは、Qiita 初投稿です。
私は最近競技プログラミング（競プロ）にはまってきて、EventHorizon という ID で AtCoder に参加している競プロ等初心者です。
C++をメインで使っているのですが、デバッグに長時間とられるためデバッガーを備えるエディタ Visual Studio Code (VSCode) を導入（所謂「環境構築」）しました。
その他、AtCoder に自動でコードを提出する便利ツールの導入まで行いました。

これらの環境構築については既にネット上に記事がいくつもありますが、執筆者と環境が異なっていたり、執筆時から時間が経っていたりすると、紹介されている通りに設定をしたつもりでもうまく動作しないことがあり苦労しました。
この記事では、私が躓いた点とそれをどう解決したかを記します。

###### 目的

- 自分用メモ
- 他の初心者さんの参考の為
- 初心者がどこで躓くか把握したい方の為

###### 注意点
私自身、初心者で色々と理解していないまま書いている部分が多いですので、他の記事を見てどうしても環境構築ができない場合にこの記事を読んで頂ければ幸いです。また、設定は自己責任で行ってください。
また、私が詰まった箇所を重点的に記録していて、必要ステップを全て明記しているわけではない事に注意してください（途中で紹介している他記事を参考にしたり、ご自身でも検索したりしながらご活用ください）。

解説する側の方々（サービス提供者、YouTuber、本の著者等）にとっても、初心者がどこで躓くかというのは知りたい情報だという声も貰ったり見かけたりしましたので、それを記録して公開します。

記事に誤りを見つけた方はお知らせ頂けると幸いです。気付き次第訂正いたします。

###### 私の環境・知識
macOS 11.2
ターミナルは必要な時に使うが、多用はしない。cd や mkdir といった簡単なコマンドは問題無しというレベル。英語は読める。

###### 記事初公開時期
2021年3月。その後、追記と明記していない部分も修正・追記を行いました。

##### 前提
C++ 自体はインストールされている事を想定します。また、デバッガーを使う場合はデバッガーもインストールする必要があります。私はデバッガーについては特に意識せずインストールできていたので、C++と一緒にインストールされているかもしれません。ターミナルで`lldb -v`とすればデバッガーの一種である LLDB がインストールされているか確認できます。後述の理由で mac 標準の Clang ではなく GCC というタイプの C++ が必要になる場合がありますが、必要になった段階で引用先等を参考にしてインストールしてください。
#### 初心者つまずきポイント１ （１回で成功しない場合に泥沼にはまる可能性がある）
まず「mac 環境構築 VSCode」等で検索をして、でてきた解説記事１の通りに設定してみます。→何故か上手くいかない
解説記事１で必ずしも全て手取り足取り説明される訳ではありません。そこで検索で出てきた別の記事、解説記事２を参考に設定してみます→何故か上手くいかない
・・・
このようになると、それぞれの記事でやろうとしてる設定も微妙に異なってきますし、どこがいけないのかの判断が初心者には難しいと思います。

以下ではこの問題を一般には解決しませんが、私が特に参考にしたサイトを紹介しながら、私の環境でうまくいった方法を紹介します。



# Visual Studio Code のインストールと設定

環境構築の第一歩で右往左往し（数回やろうとして諦めてを繰り返しています）、どの手順で何をしたのかを正確に記録できてはいませんが、ツイートを元に再現を試みます。

https://twitter.com/EvtHorizonCoder/status/1359496733990940673

VSCode の導入・設定で困ったらまずは公式サイトを見るのが良いのではないかと思います。全部読もうとすると長いですが、概要を読むだけでも雰囲気は掴めるかもしれません。基本的な使い方のビデオなどもあります。

https://t.co/gXzmlKJduG?amp=1

#### `code .`を使えるようにする
ターミナル上で `code .` と打つと VSCode がそのディレクトリ上で開かれるという機能があるのですが、はじめ上手くいきませんでした。たしか、上のサイトの Alternative manual instructions のコードをターミナルにコピペして実行したら機能が使えるようになったんだと思います。[^PATH]

[^PATH]: パス(PATH)を通すという作業ですね。知らない方は「パスとは パスの通し方」とかで検索してみてください。これはあらゆるツールをインストールする時に必要になる知識です。忘れてもその都度検索すれば良いです。

ところで、超ウィザード級ハッカーの皆様は vim や emacs といったエディタを駆使するようですが、その使用法を覚えるのも骨が折れます。初心者の場合、macOS の . で始まる隠しファイルを編集する必要がある場合は Command+Shift+. で表示・非表示の切り替えができますので、普通に ~/.bash_profile とかを表示させてクリックして開いてテキストエディットか何かで編集する事も可能です。

#### 初心者つまずきポイント2 (VSCode の設定に関する基礎知識)
VSCode の設定は全体設定とワークスペース毎の設定があるようです。
これのせいで解説記事の settings.json の設定をどこに反映させれば良いのか間違えがち。
多分まずは全体設定の settings.json に書き込んでおけば良いでしょう。
ただ、開いているワークスペースに設定ファイルがあるとそちらの設定が優先されるでしょうから、そちらにも設定すると良いかもしれません。

全体設定は Code > Preferences > Setting （または対応する日本語メニューの項目）から設定項目を検索して設定できます。検索すると、setting.json の関係ある部分しか表示されないようなので、setting.json ファイルの大部分が削除されてしまった！と焦って勘違いしないようにしましょう。

ワークスペース毎の設定ファイルは、VSCode の左側の Explorer タブにファイル一覧が表示されます。 .vscode フォルダ内の設定ファイルから設定可能です。c_cpp_properties.json, tasks.json, launch.json の設定をしますが、これらはワークスペースとして開いた階層の .vscode 内に作ります。

#### 統合ターミナルを使えるようにする
VSCode を使うならこれができると便利です。VSCode 内でターミナルが使えます。（細かい事を言うと、普通に使うターミナルと内部設定が異なるとかがあるようですが、そこまでは解説できません。）
先ほどはターミナルから VSCode を開けるようにしたわけですが、ここでは VSCode からターミナルが使えるようになるというわけです。

VSCode に関する詳細な日本語のメモがあります。

https://qiita.com/satokaz/items/6a6a0d9b6489ec2d1803

この統合ターミナル関連の部分を参考にさせて頂きました。
まず、統合ターミナルを使うという設定をオンにする必要があるので、上記サイトまたは VSCode 公式サイトを参考にしてください。（余裕があれば後で詳細を書き足します）

さて、私の場合は最初こうなりました。

https://twitter.com/EvtHorizonCoder/status/1359512395119398913

このツイートは上記初心者つまずきポイント２で言及した setting.json の大半が消えてしまったと勘違いしている様子（笑）と、ターミナルが見つからない事に起因するエラーコードを示しています。

自分の使っているターミナル（私の環境では zsh）のある場所はターミナル上で `echo $SHELL` とすれば表示できますので、これを必要な箇所にコピペしていきます。

VSCode の全体設定で`terminal.integrated.shell.osx`と`terminal.integrated.automationShell.osx`を検索して、上で確認したターミナルの場所（`/bin/zsh`など）を書き入れます。上記サイトが役に立ちました。

#### 拡張機能のインストール

VSCode 上で各言語のシンタックスハイライトや IntelliSense 機能等を行う為に拡張機能（C/C++, Code Runner, CodeLLDB 等）をインストールします。（これらは VSCode 上の拡張機能であって、C/C++ 自体や LLDB 自体ではないので混同しないようにしましょう。）
これは多くのサイトで解説されているのでここでは省略します。C/C++ と Code Runner を入れておけばとりあえずは十分のようですね。Code Runner はインストールだけでなく設定事項があります。次のセクションで、設定の参考にしたwebサイトを紹介します。
拡張機能のインストールは統合ターミナルの設定前に行っても良いと思います。また、日本語に対応させる拡張機能や画面の配色を変える拡張機能もありますので、お好みに応じて導入してください。

### デバッガー機能を使えるようにする！
やはりデバッガー機能が VSCode の目玉ですよね。使えるようにしていきましょう。

基本的にこの記事が大変参考になりました。

https://blog.spiralray.net/cp/devenv-cpp

##### 厄介ポイント
`#include <bits/stdc++.h>` を使えるようにしたいかどうかで参考にすべきサイトが変わってきます。C++ (GCC) と C++ (Clang) のうち、前者でのみ `#include <bits/stdc++.h>` が使えるそうです。`#include <bits/stdc++.h>`の是非は諸説あるようですが、初心者がどのパッケージをインストールする必要があるかに煩わされなくて良いという利点があり、私も使いたいと思いました。
ただし[上記サイト](https://blog.spiralray.net/cp/devenv-cpp)によると、デバッガー機能関連で GCC との相性がよくないらしく（？）、ローカルのコンピュータ上では Clang を使い、AtCoder への提出用には GCC を指定するというややトリッキーな事になっています。

>デバッグ環境をGCCで環境構築しようとするとGDB周りで泥沼にはまったので、Clangでの環境構築となります。
>(VSCode上にGDBでいい感じにデバッグ環境を構築できた方、やり方教えて下さい)

従って、もし他にシンプルな方法があればそちらを採用した方が良いかもしれません。

[上記ページ](https://blog.spiralray.net/cp/devenv-cpp)は簡潔にやるべき事がまとまっていますが、

https://qiita.com/EngTks/items/ffa2a7b4d264e7a052c6

こちらはもう少し詳しい説明があります。
一度に色々やると大変なので、まず AtCoder Library 関係は後回しにする事にしました。デバッグ機能をまず使えるようにします。

結論から言うと、上記[1つ目のサイト](https://blog.spiralray.net/cp/devenv-cpp)に従って bits/stdc++.h をダウンロードしてくれば良いです。
私の場合は[２つ目のサイト](https://qiita.com/EngTks/items/ffa2a7b4d264e7a052c6)を参考にした後に[１つ目のサイト](https://blog.spiralray.net/cp/devenv-cpp)を参考にしたので bits/stdc++.h を二箇所に入れてしまいました。以下はエラーが出たので VSCode の設定をツイートしたもの。以下に述べる様に、[2つ目のサイト](https://qiita.com/EngTks/items/ffa2a7b4d264e7a052c6)の方法で mac の奥深くから探してきた stdc++.h を使うと、幾つかの行をコメントアウトする必要がありました。

https://twitter.com/EvtHorizonCoder/status/1366053639979114496

`rm $dir/$fileNameWithoutExt &&` の部分は必要無いと考えられるので取り除くと、別のエラー（stdc++.h 関連）になりました。
解説記事で指定されたディレクトリに stdc++.h を置いたにも関わらずエラーとなりましたが、以下の Q&A によると stdc++.h 内で必要箇所にコメントアウトをすると良いとのこと。

https://www.quora.com/The-header-file-%E2%80%9Cbits-stdc++-h%E2%80%9D-is-not-working-on-my-OSX-How-to-make-it-work

```cpp

#include <cstdalign>
#include <cuchar>
#include <memory_resource>
```

この３つをコメントアウトしたところでエラーが無くなり、デバッグできるようになりました。[2つ目のサイト](https://qiita.com/EngTks/items/ffa2a7b4d264e7a052c6)の方法で準備した stdc++.h にはコメントアウトの必要だった３行が含まれていますが、[1つ目のサイト](https://blog.spiralray.net/cp/devenv-cpp)の方法で準備した stdc++.h には無かったので、これから stdc++.h を用意する方は[1つ目のサイト](https://blog.spiralray.net/cp/devenv-cpp)のように stdc++.h を準備すれば良いでしょう。それでうまくいかなかった場合は、ここで紹介した３行をコメントアウトして[2つ目のサイト](https://qiita.com/EngTks/items/ffa2a7b4d264e7a052c6)の方法を試してみるとできるかもしれません。

##### OS アップデート後のエラー

す〜ぐエラー出してくるんだよな計算機ってやつは。

https://twitter.com/EvtHorizonCoder/status/1370051759817650178

ターミナルから `xcode-select --install` で直りました。

#### デバッガーの基本的な使い方

VSCode のデバッグのやり方は、文章で読むより動画を観た方が分かりやすいかもしれません。
例えば以下の動画が参考になります。

https://www.youtube.com/watch?v=xjkFLZsZYKk&t=351s

https://www.youtube.com/watch?v=X2tM21nmzfk

break point を設定して、

- 次の break point まで進む (continue) か、
- １ステップだけ進める (step over) か、
- 呼び出している関数の中に入って何が起きているか調べる (step into) か、
- その逆で上の階層に戻る (step out) か、
- コードの最初から実行し直す (restart) か、
- デバッグを終了する (stop) か

を操作していきます。この時左側の Run and Debug タブの VARIABLES の項目で各変数の値を時事刻々とチェックできます。特別に監視しておきたい変数は中段の WATCH の所で追加できます。（いまいち使い分け方を分かっていないのですが、VARIABLES には自分が見たい変数以外も並ぶので狭くて並べきれないから、ということでしょうか（？））

これ以上の詳しい使い方は私も知らないのですが、VSCode の公式サイトに書いてあるかな？
おすすめの情報源がある方は教えてください。

#### デバッガーオプション

デバッグ機能が使える所まで確認できたら、必要に応じてデバッグの為のコンパイルオプションを設定しましょう。オプションの追加によってデバッガーが指摘してくれる項目が増えます。
VSCode の setting.json で `code-runner.executorMap` を検索します。
例えば上で紹介した[参考サイト](https://blog.spiralray.net/cp/devenv-cpp)では

```json

"code-runner.executorMap": {
        "cpp": "cd $dir && rm $dir/$fileNameWithoutExt && clang++ -std=c++17 $fileName -o $fileNameWithoutExt && $dir/$fileNameWithoutExt",
    }
```
という項目がありました。（上述したように環境によっては `rm $dir/$fileNameWithoutExt &&` を消さないといけないかもしれません。）

また、tasks.json のデバッグ用の設定項目にも `"args"` という項目があり、`-Wall` といったオプションが書かれています。（Wall は壁ではなく Warning all という意味。ただし Wall と書けば全て教えてくれるという訳でもないみたい。）

これらのどちらか又は両方に必要に応じてデバッグの為のコンパイルオプションを追記します。
上記[参考サイト](https://blog.spiralray.net/cp/devenv-cpp)のように設定した場合は、前者の編集で通常実行時に関する指定ができ、後者(tasks.json)の clang++ 関連の編集で lldb によるデバッグ実行時に関する指定ができます。

以下のツイートのように色々なオプションがあるようですね。私は理解できていませんが、いくつかツイートを見ると `-Wall -Wextra -Wshadow` 辺りがおすすめされているようです。

https://twitter.com/_shouth_kit/status/1286919933557800960

https://twitter.com/lorent_kyopro/status/1298899997820219392

デバッグ用の警告オプションをつけると以下のようなミスにも気付きやすいとのこと。（このリプライを頂いた時点だとデバッガーをどう使うのか分かりませんでした。）

https://twitter.com/angel_p_57/status/1355916692677750789

「C++ デバッグ用　コンパイルオプションまとめ」等で検索しても期待したほど解説記事がでてきませんでしたが、以下のサイトが参考になりそうです。

https://xn--kst.jp/blog/2019/08/29/cpp-comp/

https://codeforces.com/blog/entry/15547#comment-205104


##### デバッグ・バグ予防の一般論

デバッグ関連で気をつけたい事について参考になるサイトです

https://qiita.com/lanevok/items/bbdf5a4f642d027a5d4e

https://blog.knshnb.com/posts/competitive-cplusplus-real/#.YB9K5lrhh9I.twitter

# AtCoder 等への自動提出や AtCoder Library 関連

これもこのサイトのやり方が基本的に参考になりました。

https://blog.spiralray.net/cp/devenv-cpp

こちらも参考になります。

https://blog.knshnb.com/posts/vscode-oj-acl/

[AtCoder Library](https://atcoder.jp/posts/517) は [AtCoder](https://atcoder.jp/) の公式サイト([github](https://github.com/atcoder/ac-library))からダウンロードし、[公式サイトの説明](https://atcoder.github.io/ac-library/master/document_ja/appendix.html)の通りの場所に置けば大丈夫でした。ホームディレクトリに置いてパスを通しました。

https://twitter.com/EvtHorizonCoder/status/1370057122038222848

AtCoder Library と自動提出の話は本来は直接関係無いですが、他のサイトでもまとめて説明されていたりするので、ここでも次に自動提出の話に入ります。（AtCoder Library を使っての自動提出に対応させる為です。）

上記[１つ目のサイト](https://blog.spiralray.net/cp/devenv-cpp)、およびそこで引用されているサイトを参考に、`atcoder-cli` に対応する設定を VSCode に書き込み、`atcoder-cli` と `online-judge-tools` をインストールします。これらをインストールする時に追加でインストールが必要なものもありますが、`atcoder-cli` 公式サイト

http://tatamo.81.la/blog/2018/12/07/atcoder-cli/

のインストールガイドの通りに実行します。`atcoder-cli` が別のツール `online-judge-tools`

https://github.com/online-judge-tools/oj

の機能を使うという仕組みです。

さて、私が遭遇した初心者的エラーはこちらです。
(追記: oneline-judge-tools の公式ページに online-judge-tools の[インストール方法の詳細](https://github.com/online-judge-tools/oj/blob/master/docs/INSTALL.ja.md)が分かりやすく解説されています。`atcoder-cli`も`online-judge-tools`もそれぞれの公式ページに日本語での説明が提供されています。前者はトップページも日本語で分かりやすいです。後者の使い方ページは[こちら](https://github.com/online-judge-tools/oj/blob/master/docs/getting-started.ja.md)です。日本語でサポートされているツールの開発に感謝しつつ使わせて頂きましょう。)

https://twitter.com/EvtHorizonCoder/status/1369668618846310415

`online-judge-tools` のインストールではターミナルで --user をつけたらどう？と提案されるので `pip3 install online-judge-tools --user` とすればインストールできました。一方、`atcoder-cli` のインストールは sudo をつけて `sudo npm install -g atcoder-cli` で実行できました。sudo[^sudo]は知っていたけど、インストールガイドに明示的に書いてなくてアレ？ってなってしまいました。

[^sudo]: ターミナル上で管理者権限でコマンドを実行する時につける単語です。 substitute user do あるいは superuser do の略と言われているそうです [[参考](https://gihyo.jp/admin/serial/01/ubuntu-recipe/0410)]。


普通にインストールできれば使えるはずですが、私の場合 python のプリインストールされているもの（？）と Anaconda のバージョンがあるせいか（？）パスの指定で少し手間取りました。

https://twitter.com/EvtHorizonCoder/status/1370038697798733827


#### 初心者つまずきポイント３ （連携ツールのエラーの原因の探索）
atcoder-cli の機能／エラーなのか online-judge-tools の機能／エラーなのかよく分からない。

https://twitter.com/EvtHorizonCoder/status/1370376329963524097

このエラーは言語がマッチしないということなので VSC, atcoder-cli, online-judge-tools などの設定全体のどこで言語の設定をしているかを把握しないといけません。

結論から言うと最も参考にさせて頂いたサイト

https://blog.spiralray.net/cp/devenv-cpp

の tasks.json の `-l 4101` の部分が現在の AtCoder の言語番号とずれてしまっていたのが原因のようです。（仮に AtCoder が気まぐれで今日言語番号を１ずつずらしたらコンパイルエラーになってペナルティーを貰ってしまいますね…。）
この `4101` を C++ (GCC 9.2.1) の場合は `4003` に設定し直せば提出もできるようになりました。

https://twitter.com/EvtHorizonCoder/status/1370386201568370690

なんかまだ警告が出るのだけれど、とりあえずエラー無しで使えるようにはなりました。

##### テンプレートファイル

atcoder-cli を使う上でテンプレートファイルを設定しておくと便利です。既に紹介したサイトの通りに設定した上で、テンプレートファイルを main.cpp という名前で `acc config-dir` とした時に表示されるディレクトリの cpp フォルダに入れておくと使えます。（設定を変えれば main.cpp という名前にする必要はありません。詳細は `atcoder-cli' [チュートリアル](http://tatamo.81.la/blog/2018/12/07/atcoder-cli-tutorial/)]及び上記[参考サイト](https://blog.spiralray.net/cp/devenv-cpp)を参照。）

##### おまけ: Python 等
Python の環境構築もしてみました。C++ より簡単です。やった事と言えば、VSCode で Python 用の拡張機能を入れた事くらいですかね。（自動提出までは設定してません。）Anaconda distribution の Python を使う場合は Anaconda prompt から code . せよと公式サイトに書いてありますのでその点を注意するくらいかな。

https://code.visualstudio.com/docs/python/python-tutorial#_start-vs-code-in-a-project-workspace-folder

ただ、標準入力をターミナルから受け取るのが、デバッグモードの時しかできません。これはそういう仕様なのでしょうか。

ところで Wolfram Language って VSCode で使えるんでしょうか？

https://twitter.com/EvtHorizonCoder/status/1369312997307539471


### 謝辞

環境構築で困っている時に助言を下さったえびちゃんさんに特に感謝いたします。おかげで環境構築ができました。また、質問をさせて頂いたどきんさんと、online-judge-tools 関連で助言を下さったkimiyuki＠うさぎ(🐇マーク)さんに感謝いたします。angel as ㌵㌤の猫さんには、コンパイラの警告オプションを教えてくださった事に感謝いたします。この時コードの間違いも指摘して頂きました。この流れで、環境構築と直接関係ありませんが、私が競プロ用Twitterを開設した後初めて質問ツイートに答えて下さったこたつがめさんへの感謝も忘れられません。

また、私が参考にさせて頂いた各種サイトの執筆者や各種ツールの developer の皆様に感謝いたします。

えびちゃんさんのサイトは C++ 初心者（以上）に有益です。環境構築と直接は関係ありませんが、デバッグをしたいという目的と通じるのでここで紹介します。

https://rsk0315.hatenablog.com/entry/2020/05/09/170315

また kimiyuki＠うさぎ さんに紹介頂いたツールを紹介します。

https://github.com/online-judge-tools/template-generator/


### 環境構築中に参考にしたサイトのリスト
全ては記載できておりません。

https://t.co/gXzmlKJduG?amp=1

https://qiita.com/satokaz/items/6a6a0d9b6489ec2d1803

https://blog.spiralray.net/cp/devenv-cpp

https://blog.knshnb.com/posts/vscode-oj-acl/

https://qiita.com/EngTks/items/ffa2a7b4d264e7a052c6

http://tatamo.81.la/blog/2018/12/07/atcoder-cli/

https://github.com/online-judge-tools/oj

https://qiita.com/miriwo/items/fbe9c339d144a0940d08

https://ynucpc.github.io/blog/2018/04/15/cp_vscode/