C++環境構築メモ （Mac, VSCode, GCC, 競プロ）

# はじめに
C++環境を構築したので、その時の備忘録を残す。競プロにおいて、C++のコンパイラは、Mac標準でインストールされているClangよりも、GCCの方が便利である。なので、今回はGCCをインストールした。

# 環境
* MacOS BigSur
* VSCode

# 1. コンパイラ（GCC）のインストール等
## (1) gccコンパイラのインストール

```
% brew install gcc
```

## (2) インストールされたGCCのバージョン確認

```
% ls -l /usr/local/bin | grep g++
g++ -> /usr/local/bin/g++-11
g++-11 -> ../Cellar/gcc/11.2.0_3/bin/g++-11
x86_64-apple-darwin20-g++-11 -> ../Cellar/gcc/11.2.0_3/bin/x86_64-apple-darwin20-g++-11
```

この段階で、下記コマンドを実行すると、コンパイルされて実行ファイルが生成される。

```
% /usr/local/bin/g++-{num} main.cpp
```

## (3) シンボリック作成によるバージョン省略
/usr/local/bin内にg++をシンボリックリンクとして作成し、リンク先に/usr/local/bin内のg++-{num}を指定することで、バージョンを省略。

```
% ln -s /usr/local/bin/g++-{num} /usr/local/bin/g++
```

この段階で、gccのバージョンを省略した下記コマンドを実行すると、同様に、コンパイルされて実行ファイルが生成される。

```
% /usr/local/bin/g++ main.cpp
```

## (4) コマンド検索パスの設定
以下のコマンドを実行したときの出力が、`/usr/local/bin/g++`ではなく、`/usr/bin/g++`だった場合は下記の設定をする必要がある。これは`g++`コマンドを実行した場合、インストールしたGCCではなく、mac標準でインストールされているClangが実行されてしまうことを意味する。

GCCが検索されている場合（所望）

```
% which g++
/usr/local/bin/g++
```

Clangが検索されている場合 -> 下記の設定を行う

```
% which g++
/usr/bin/g++
```

### ClangではなくGCCが検索されるための設定
下記のコマンドを実行したときの出力で、`/usr/local/bin`が`/usr/bin`よりも上位にある場合、検索優先順位は`/usr/local/bin`の方が高いので何もする必要はないので、次節に行ってok。もし、この状態でGCCが検索されないときはターミナルを再起動する。

```
% echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
```

`/usr/bin`の方が上位にある場合は、`~/.zshrc`に`export PATH=/usr/local/bin:$PATH`を書き込んで、下記のコマンドを実行。

```
% source ~/.zshrc
```

以上より、下記コマンドを実行することで、gccが検索されるようになっているはず。

```
% which g++
/usr/local/bin/g++
```

また、下記コマンドでも確認可能。

```
% g++ -v
```

そして、最終的にg++コマンドで、GCCコンパイラを呼び出せるようになる。

```
% g++ main.cpp
```

# 2. VSCodeのExtensionのインストール
* C/C++ : コード整形、タグジャンプ、自動補完を行ってくれる。
* Code-Runner : 言語（ファイル拡張子）ごとに実行するスクリプトの設定が可能 -> ショートカットキー（[ctrl] + [opt] + [n] キーで、コンパイルから実行まで一度にできる）

## (1) コード整形をファイル保存時に行うように設定
C/C++ Extensionにformatterが含まれているので、これでコード整形が可能になる。
コード整形するために[Alt] + [Shift] + [F]を毎回押すのはめんどくさいので、[cmd] + [s]でファイル保存時に整形されるように設定する。 

手順
1. [ファイル] ＞ [基本設定] ＞ [設定] で設定画面を開く。
2. 検索ボックスに 『formaton』 と入力すると、
『Editor: Format On Save』 があるので、これにチェックを入れる。

## (2) Code-Runnerの設定
左側のExtensionタブを選択し、install済のCode Runnerを探す。
Code Runnerの歯車のマークをクリックし、Extension Settingsを選択。

右画面に設定画面が出てくるので
Code-Runner: Run In Terminalのチェックボックスを入れる。

# 3. stdc++.hを利用できるようにする
ヘッダファイルのstdc++.h をincludeすることで、競プロに必要なライブラリを一括でincludeすることができる。
なので、このヘッダファイルincludeできるようにする。
ただ現状では、
`#include <bits/stdc++.h>` を書くと下記のような破線で警告がでるハズ。（赤破線）
また、コンパイルしようとすると、stdc++.hが見つからず、エラーになる。

## (1) stdc++.hをコンパイラが認識できる場所にコピー

stdc++.hは、GCCをインストールする後、/usr/local/下の奥深くの階層に存在する。
下記コマンドで場所がわかる。（バージョンは各自異なる）

```
$ cd /usr/local/
$ find . -name "stdc++.h"
./Cellar/gcc/11.2.0_3/include/c++/11/x86_64-apple-darwin20/bits/stdc++.h
```

コンパイラが認識できる階層は、/usr/local/下である。
なので、下記コマンドで/usr/local/include/下にbitsディレクトリを作成し、stdc++.hをコピー。

```
$ mkdir /usr/local/include/bits
$ cp ./Cellar/gcc/11.2.0_3/include/c++/11/x86_64-apple-darwin20/bits/stdc++.h /usr/local/include/bits/
```
これで、#includeをつけてコンパイル可能になる。
しかし、vscodeのIntellisense機能がstdc++.hを認識出来ていないため、
まだ緑破線で警告が出てしまう。

## (2) C/C++ Intellisenseの設定
次に、インストールしたC/C++ Intellisense機能に/usr/local/include/bits/stdc++.hの存在を教えてあげる必要がある。

Command+Shift+P でコマンドパレットを開き、
「C/Cpp: Edit configurations」 を選択する。

```
{
    "configurations": [
        {
            "name": "Mac",
            "includePath": [
                "${workspaceFolder}/**",
                "/usr/local/include/**"
            ],
            "defines": [],
            "macFrameworkPath": [],
            "compilerPath": "/usr/local/bin/g++",
            "cStandard": "gnu17",
            "cppStandard": "gnu++17",
            "intelliSenseMode": "macos-gcc-x64"
        }
    ],
    "version": 4
}
```

includePathに"/usr/local/include/**"を追加し、
compilePathを"/usr/local/bin/g++"に変更すればok。

以上で、#include <bits/stdc++.h>が正常に認識されるようになる。
ダメな場合は、vscodeを再起動してみると良い。

# 終わりに
やっぱり環境構築は、ちょっとめんどいですね。
 
# 参考
* https://qiita.com/DaikiSuyama/items/09f5aa399aad37783146
* https://qiita.com/EngTks/items/ffa2a7b4d264e7a052c6