ろぐれこーど

限界組み込みエンジニアの学習記録とちょっぴりポエム

macOS + vscode + clangでatcoder C++デバッグ環境構築

ソフトウェアエンジニアっぽくない仕事ばかりして久しいですが、最低限コーディングとかアルゴリズムとかわかっていたいと思う自分がいるのでatcoder始めてみました。昔すこしだけpythonでやってたんですが、コード解説とか多い&仕事とかで今後使うかも ということでC++でやることにする。

vscodeC++デバッグ環境を作るのが初めてだったので備忘録として残しておく。

環境

  • 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 + gdbvscode上のデバッガ実行しようとしましたが、コンテナ内部の値が見れない現象が発生しました。(元記事はここ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/includebits/作って置くだけ。

Linux GCC 4.8.0 /bits/stdc++.h header definition with <cstdalign> error fixed. · GitHub

(GCC 4.8.0 bits/stdc++.h って書いてるからちょっと古いかも?とりあえず困らないのでこれでいく)

以下のサイトまんまなので困ったら↓を見る or 適宜ぐぐる

qiita.com

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",
     }
    ]
}

コンパイラ設定は以下公式にあるものを参考に設定している。

atcoder.jp

tasks.jsonを作成すればcommand + shift + bでビルドできるようになります。デバッグ時、最適化がかかっていると上手く動かないことがあるので-O0を設定しておく。task.jsonはビルドタスクだけでなく、順次実行するタスクであれば色々記述できるらしいので気になる方は調べてみてもいいかも。以下参考

maku.blog

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"
        }
    ]
}

設定方法などは以下を参照。

code.visualstudio.com

大体デフォルトでよいが、いじるのは以下項目くらい。

  • 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++にする。atcoderc++17採用なのでcppStandardを適用しておく。

解いてく

慣れてきたらスニペットとかも適宜設定していくのが良さそう。とりあえずBoot CampをEasyから埋めていく。