macOS + vscode + clangでatcoder C++デバッグ環境構築
ソフトウェアエンジニアっぽくない仕事ばかりして久しいですが、最低限コーディングとかアルゴリズムとかわかっていたいと思う自分がいるのでatcoder始めてみました。昔すこしだけpythonでやってたんですが、コード解説とか多い&仕事とかで今後使うかも ということでC++でやることにする。
vscodeでC++デバッグ環境を作るのが初めてだったので備忘録として残しておく。
環境
- macOS Monterey 12.6.3
- VSCode 1.77.3
- Apple clang version 14.0.0 (clang-1400.0.29.202)
- lldb-1400.0.38.17
インストール
clangを使います。atcoderやる上では特にgccでもclangでも困ることはないですが、
- clangはstdc++.hがデフォで入っていないため、自分でファイルを置いてやる必要があります
- gcc + vscode + gdbでvscode上のデバッガ実行しようとしましたが、コンテナ内部の値が見れない現象が発生しました。(元記事はここhttps://github.com/Microsoft/vscode-cpptools/issues/69のようです) 色々試しましたが解消しなかったため、clang + lldbでやっています
clang
XCodeをインストールすれば勝手に入ります。lldbも入る。適当に調べて入れるだけ。
競プロ用途だと特に困らないと思いますが、XCodeで入るclangはAppleが手を加えた少し古いバージョンなので、最新機能などは使えないため注意が必要です。(最新版はHomebrewで入れられそう、詳細はここhttps://students-tech.blog/post/install-clang.htmlとか)
またmacだと自動でgcc→clangのシンボリックリンクが貼られるそうで、gcc使ってるつもりが実は裏でclangが動いてた、みたいなことになるため注意。gccを使いたければHomebrewでgccインストールする必要あり。
bits/stdc++.h
atcoderではよく使うライブラリ全部入りのbits/stdc++.h
というヘッダファイルをインクルードすることが多いが、clangにはデフォルトで入っていないので自分で入れてやる必要がある。(この辺がめんどくさいからgcc使っている人も多い気がする)
以下ファイルをstdc++.h
として保存し、/usr/local/include
にbits/
作って置くだけ。
Linux GCC 4.8.0 /bits/stdc++.h header definition with <cstdalign> error fixed. · GitHub
(GCC 4.8.0 bits/stdc++.h って書いてるからちょっと古いかも?とりあえず困らないのでこれでいく)
以下のサイトまんまなので困ったら↓を見る or 適宜ぐぐる
vscode
インストールは好きにやる。C/C++の拡張は入れておく。
tasks.json
ビルド設定をします。以下をtask.json
としてプロジェクトディレクトリの.vscode/
配下に保存します。
{ "version": "2.0.0", "tasks": [ { "type": "cppbuild", "label": "C/C++: Build with Clang", "command": "/usr/bin/clang++", "args": [ "-std=c++17", "-stdlib=libc++", "-g", "-O0", "${file}", "-o", "${workspaceFolder}/a.out" ], "options": { "cwd": "${fileDirname}" }, "problemMatcher": [ "$gcc" ], "group": "build", } ] }
コンパイラ設定は以下公式にあるものを参考に設定している。
tasks.json
を作成すればcommand + shift + b
でビルドできるようになります。デバッグ時、最適化がかかっていると上手く動かないことがあるので-O0
を設定しておく。task.json
はビルドタスクだけでなく、順次実行するタスクであれば色々記述できるらしいので気になる方は調べてみてもいいかも。以下参考
launch.json
vscodeによるデバッグ実行時の設定などを、各言語に合わせて記述する。atcoder用設定は以下。
{ "version": "0.2.0", "configurations": [ { "name": "(lldb) Launch", "type": "lldb", "request": "launch", "program": "${workspaceFolder}/a.out", "cwd": "${workspaceFolder}", // "preLaunchTask": "C/C++: Build with GCC" } ] }
設定方法などは以下を参照。
大体デフォルトでよいが、いじるのは以下項目くらい。
- program: デバッグ対象の実行ファイル。vscodeで開いたディレクトリ直下に置く想定。
- preLaunchTask: デバッグ実行前に実行するビルドタスクを指定できる。
tasks.json
で記述したlabel
を指定する。 自分はビルドはcommand + shift + b
でやることが多いので一旦コメントアウトしています
c_cpp_properties.json
C++のビルド設定など。
{ "configurations": [ { "name": "Mac", "includePath": [ "${workspaceFolder}/**" ], "defines": [], "macFrameworkPath": [ "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks" ], "compilerPath": "/usr/bin/clang++", "cStandard": "c17", "cppStandard": "c++17", "intelliSenseMode": "clang-x64" } ], "version": 4 }
特筆すべきところはない、、と思う。compilerPath
は忘れずにclang++にする。atcoderはc++17採用なのでcppStandard
を適用しておく。