始めに
C/C++でプログラミングをやるには、その文法の難しさやさまざまな知識を要求されることもそうなんですが、第一にコンパイルする大変さがあります。
ましてや、ちゃんとコンパイルできるとこまでたどり着けても、やはり
- 編集
- コンパイル
- 実行
- 目的の結果が得られるまで1から3を繰り返す
というのは結構めんどくさいです。
そこで、少しでも楽にこれを回せる環境を作ろうと思います。
理解ってる人へ
本稿の目的はビルドとデバッグを高速で回すことです。ある程度開発やってる人はmake使ってるかと思いますがこれとはやることがちょっと違って、ごく小さなプログラムを多数配置する、たとえば学校の課題をこなしたり、AtCoderやAOJを解いていったりするのを想定しています。
目標
いろいろカスタマイズしているので、UIが多少違うのはご承知おきください。
要件
Windows11の人向け。あとちょっと時間かかります。
わからん用語とかはググってどうにかしてね★
準備
- WSLをinstall
- Ubuntuを設定
- vscodeと連携
この辺りはいろいろ解説が出てるのでそちらを参照してください。
- 【WSL / WSL2】VSCode×WSLでWindows上にLinux開発環境を構築
- WSL を使用して Windows に Linux をインストールする方法
- Visual Studio Code を使用した Linux 用 Windows サブシステムでの開発
- Visual Studio Code を使用した Linux 用 Windows サブシステムでの開発
設定の仕方
ひとまずWindows TerminalからUbuntuを開き、適当なプロジェクトを作ります。
$ mkdir project
$ cd project
$ code .
次に、このrepositoryをcloneして、READMEどおりに配置してください。
具体的には、terminal(vscodeでctrl+@を押下すると画面下部に表示されます)を開き、以下のコマンドを打ってください。
$ pwd
/home/<user name>/project // 一応ちゃんと指定したディレクトリにいるか確認してください
$ git clone https://github.com/Desert-sabaku/vscode_cpp.git
$ mv vscode_cpp .vscode
これで設定は完了です。
gitコマンドがねえよ!と言われた人は、次を実行してください。
$ sudo apt install git
使い方
適切に配置できていれば、このような感じになります。
さて、適当なCのファイルを作り、キーボード上部にあるF5を押下してください。
自動で実行、コンパイルしてくれます。
また、デバッガーも扱うことができます。
画像のように行番号をクリックして"break point"を貼ってやり(画像では8行目)、この状態で実行してやると、8行目でプログラムが一時停止、この時点での変数の中身が見られます。
F5を連打してカウンター用の変数iや和を保存する用の変数sumの値が変化していくさまが左側のバーにある"Run and Debug"のタブから確認できます。
デバッグについての詳細などは、以下を参照してください。
説明
大まかな仕組みについてざっくりと解説しておきます。
| ファイル名 | 役割 |
|---|---|
| launch.json | デバッグ実行のための基本設定を記述するファイル |
| tasks.json | 実行時に具体的にどのような命令を実行するかを記述するファイル |
| c_cpp_properties.json | CやC++のバージョンやパスなどの情報を記述 |
Cファイルでビルドを起動すると、launch.jsonが読まれ、そこからtasks.jsonを読み込みます。
以下の抜粋のように、tasks.jsonには具体的なコマンドなどが記述されていますので、挙動をいじりたくなったときはひとまずここを覗いてみるとよいでしょう。
たとえば、"command"の項目に"g++"コマンドが、"args"は言葉通りコマンドに渡される引数ですが、gccを使っている人なら何となく読めると思います。"-o"フラグは出力される実行ファイルの名前を指定することができるものでした。
参考:gccの主なオプション
| オプション | 説明 |
|---|---|
-o <file> |
出力ファイル名を指定(デフォルトは a.out) |
-c |
コンパイルのみを行い、リンクはしない(.oファイルを生成) |
-Wall |
すべての一般的な警告を表示 |
-Werror |
警告をエラーとして扱う |
-g |
デバッグ情報を生成(GDB用) |
-O, -O1, -O2, -O3
|
最適化レベルを指定(-O3が最高レベルの最適化) |
-std=<version> |
使用するC/C++標準を指定(例:-std=c99、-std=c++17) |
-I<dir> |
インクルードファイルの検索ディレクトリを追加 |
-L<dir> |
ライブラリの検索ディレクトリを追加 |
-l<library> |
リンクするライブラリを指定(例:-lmで数学ライブラリ) |
--version |
gcc のバージョン情報を表示 |
--help |
使用可能なオプションの一覧を表示 |
{
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: g++ debug active file",
"command": "/usr/bin/g++",
"args": [
"-fdiagnostics-color=always",
"-g",
"${file}",
"-o",
"${workspaceFolder}/bin/${fileBasenameNoExtension}.exe",
"-lm",
"-Wall",
"-Wextra",
],
},
],
"version": "2.0.0"
}
途中にある${~~}という風な文字列は、VS Codeのvariablesです。動的(「実行するとき」の意)に、たとえば${workspaceFolder}ならVS Codeが開いているディレクトリのパスを返してくれます。とにかく、プロジェクトに応じて名前とか場所とか違うと思いますが、そのあたりをいい感じに調整してくれるのです。
余談:ちょっとした工夫
私が作成した設定集にはちょっとした工夫が2点ありまして、1点目は実行形式のファイルをbinというディレクトリに隔離していることです。
実際に使っていると、ディレクトリがソースとバイナリでごっちゃに埋め尽くされてUXを著しく下げたので、こうして隔離してやることで「ソースファイルはソースファイルに、実行形式は実行形式に」おいています。
2点目は、ビルド用のtaskとデバッグ用のtaskがわけてあることです。
launch.jsonやtasks.jsonを見てみるとわかりますが、構成が各々2部に大別できることが読み取れるかと思います。
実際に、Run and Debugのタブ上部の歯車マークの左側にある欄をクリックしてみると、サジェストにbuildとdebugの二項目が表示されていることがわかります。
両者の違いは、GCCのwarning設定をonにしているかどうか、です。GCCは"-W"などのフラグを付けてやると、コード中の間違いではないがやめておいた方がいいコードを検知してwarningとして知らせてくれます。
終わりに
まあ、書きたいことは書けたので良しとします。なんかあったら書き足します。
今後の展望としては、GCCからClangに移行したいですね。なんかGCCって標準化遅いし最適化の有無でエラーがことなるとかいう妙な挙動とるんですよね。Clangがその辺どうなってるのか全然試してないのでわかりませんが…
最後に:初心者こそdebuggerとsanitizerを覚えよう!!!!
追記:clang用の設定も追加しました。使いたい人はREADME読んでください。





