はじめに
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]でファイル保存時に整形されるように設定する。
手順
- [ファイル] > [基本設定] > [設定] で設定画面を開く。
- 検索ボックスに 『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 が正常に認識されるようになる。
ダメな場合は、vscodeを再起動してみると良い。
終わりに
やっぱり環境構築は、ちょっとめんどいですね。