競プロをやってみたいなと思ったので、macで競プロをやるためにC++の環境構築をしてみます。
まず、競プロのC++のコンパイラにはClang系とgcc系の二つがあるらしく、macではデフォルトのC++のコンパイラとしてClang系が標準で搭載されています。
しかし、競プロ視点からClang系とgcc系のコンパイラどっちが良いかというとgcc系のコンパイラの方が良いそうです。
理由はgccにのみstdc++.hというC++の標準ライブラリの集合体が入っており、#include 一行書くと、必要なライブラリがだいたい揃う。からだそうです。
そのため、今回は
Macにgcc系のC++のコンパイラを入れることを目標にやっていきます。
gccをインストールします。
以下のコマンドでインストールすることができます。
brew install gcc
インストールすると、/usr/local/下に、g++-11というファイルができます。
pathの設定
gccをインストールすると、mac上にはclangと、gccが同居している状態になります。
clang => /usr/bin/g++
gcc => /usr/local/bin/g++-11
この状態でg++コマンドを打つとclangの方が呼び出されます。
$ which g++
/usr/bin/g++
``
gccの方を呼び出せるようにしたいので、以下のコマンドを入力します。
````terminal
$ ln -s /usr/local/bin/g++-11 /usr/local/bin/g++
このコマンドは/usr/local/bin/にg++(gcc)のシンボリックリンクを作成するためのコマンドです。
lnコマンドについてはこちらの記事が大変わかりやすかったです
少しこちらの記事でも解説をすると、lnコマンドとは、同じiノードをもったファイル(リンク)を作成するためのコマンドです。
iノードとは、ファイルとディスク上に存在するファイルの実体データを対応させる番号のことです。
lnの-sのオプションを付けるとシンボリックリンクというものを作成することができ、リンクを作成するというとシンボリックリンクを指すことが多いです。
ハードリンクはiノード番号をリンクさせるのに対して、シンボリックリンクはフォルダのリンクを作成することができます。
こちらの違いを詳しく知りたい人は、こちらの記事を参考にするのが良いと思います。(自分には少し難しかったです。。)
シンボリックリンクを作成した後に、ターミナルを再起動するとg++コマンドを叩いた時にgccの方を呼び出すことができるようになります!
$ which g++
/usr/local/bin/g++
元に戻したい場合は
$ rm /usr/local/bin/g++
というコマンドを打つと元に戻ることができます。
※なぜ、$ ln -s /usr/local/bin/g++-11 /usr/local/bin/g++
のコマンドを打つとg++の呼び出す方がgccに変わるのか?
答えは$PATH
の優先順位が/usr/bin
よりも/usr/local/bin
の方が高いからです。
$PATH
の優先順位は
$ echo $PATH
で見ることができます。
先にあるパスの方が優先的に呼び出されます。
今回で言うと、
/usr/local/bin/g++
と/usr/bin/g++
この二つのパスでは/usr/local/bin/g++
のパスの方が優先順位が高いのでg++コマンドを打つと/usr/local/bin/g++
が呼び出されます。
これでコンパイルの設定は終わったので、次はvscodeに移動します。
code-runnerという拡張子をインストールする
vscodeのcode-runnerという拡張子をインストールしてください。
インストールしvscodeを再起動したら、vscodeの設定も完了です。
動作確認をする
最後にうまく行くかの動作確認を行いましょう。
vscodeでmain.cppというファイルを作り、以下コードをコピペしてください
#include <bits/stdc++.h>
using namespace std;
int main(){
int a, b;
cin >> a;
cin >> b;
cout << a + b << endl;
}
そして、control + option + n
コマンドを叩くと、
画像のように自動でコンパイルしてくれて、正しく動いていることが確認できると思います!
これで環境構築の完成です!!
おまけ
vscodeでc++を書くときは**C/C++**という拡張子も入れておきましょう!
この拡張子を入れると
コードフォーマットと、自動補完をしてくれます。