VS CodeでC/C++のcompilerPath設定を完全理解|settings.json・tasks.json・launch.jsonの違いとGCC/Clang/MSVC切替手順

VS CodeでC/C++のcompilerPath設定を完全理解:
settings.json・tasks.json・launch.jsonの役割差とGCC/Clang/MSVCの切替実践ガイド

Visual Studio Code(VS Code)でC/C++開発を始めると、compilerPathやビルド/デバッグ設定の置き場所に迷いがちです。本記事では、settings.json・tasks.json・launch.jsonの3ファイルの役割を整理し、C/C++拡張による自動検出の仕組み、そしてGCC/Clang/MSVCを状況に応じて切り替えるための超実践テンプレートをまとめて解説します。Windows/WSL/Linux/macOSいずれの開発環境でもすぐに流用できるよう、具体的なコード例と運用ノウハウをふんだんに盛り込みました。

目次

要点の先出し:よくある疑問と結論

質問概要

  • settings.json/tasks.json/launch.jsonに出てくるcompilerPathは、それぞれ何に使われるの?
  • 拡張機能がファイルを自動生成するとき、コンパイラのパスはどう決まるの?
  • ビルドやデバッグのたびに、使うコンパイラを毎回選びたい。どうすればいい?
<h3>回答・解決策(役割の違い)</h3>
<div style="overflow-x:auto">
  <table>
    <thead>
      <tr>
        <th>ファイル</th>
        <th>役割</th>
        <th>影響範囲</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td><strong>settings.json</strong></td>
        <td><code>C_Cpp.default.compilerPath</code>(または<code>intelliSenseMode</code>)で<strong>IntelliSense専用の参照コンパイラ</strong>を指定。ヘッダ探索・マクロの定義・言語規格の解釈など解析品質の向上に効く。ここは<strong>ビルドには使われない</strong>。</td>
        <td>編集体験(補完・波線・型解決)</td>
      </tr>
      <tr>
        <td><strong>tasks.json</strong></td>
        <td><kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>B</kbd> で実行される<strong>ビルドタスク</strong>を定義。<code>command</code>に<code>gcc</code>/<code>clang</code>/<code>cl.exe</code>など<strong>実ビルドで使うコンパイラ</strong>と引数を書く。</td>
        <td>コンパイル(ビルド生成物)</td>
      </tr>
      <tr>
        <td><strong>launch.json</strong></td>
        <td><strong>デバッグ設定</strong>を記述。通常は<code>preLaunchTask</code>で<code>tasks.json</code>のビルドタスクを呼び出し、その出力バイナリをデバッガに渡す。<code>compilerPath</code>を直接書くことはほぼないが、<code>miDebuggerPath</code>や<code>MIMode</code>(gdb/lldb)・<code>cppvsdbg</code>の選択は重要。</td>
        <td>デバッグ(ブレークポイント・変数監視)</td>
      </tr>
    </tbody>
  </table>
</div>

<h3>自動生成時のパス決定ロジック(拡張機能の挙動)</h3>
<ol>
  <li>C/C++拡張は起動時に<strong>PATH</strong>や既知のインストール場所を走査し、<code>gcc</code>・<code>g++</code>・<code>clang</code>・<code>clang++</code>・<code>cl.exe</code>などを検出。</li>
  <li>最初に見つかった候補を既定値としてテンプレートに反映(<code>tasks.json</code>/<code>launch.json</code>の雛形)。</li>
  <li>ワークスペースやユーザーの<code>settings.json</code>で<code>C_Cpp.default.compilerPath</code>が設定済みなら、その値が<strong>IntelliSense</strong>の基準として優先。</li>
</ol>
<p><strong>WindowsでMSVC(cl.exe)を使う場合</strong>は、コンパイラのヘッダパスやライブラリの環境変数を整えた<strong>「Developer Command Prompt」または「x64 Native Tools コマンド プロンプト」</strong>からVS&nbsp;Codeを起動すると、検出が確実でビルドも安定します。</p>

毎回コンパイラを選択する4つの方法(最小から本格まで)

方法1:IntelliSenseの選択ダイアログを活かす

  1. ワークスペースの.vscode/settings.jsonからC_Cpp.default.compilerPathを削除。
  2. 初回の解析やファイルオープン時に、拡張機能が「参照に使うコンパイラ」を尋ねるダイアログを表示。ここで都度選択。

ポイント:これは編集体験に効く選択であり、ビルドやデバッグの実際のコンパイラは次項のタスク/起動設定で決まります。

<h3>方法2:複数ビルドタスクを用意してタスク選択で切り替え</h3>
<p>最もシンプルかつ堅牢。<kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>B</kbd>→目的のタスク(=コンパイラ)を選ぶだけ。</p>
{
  // .vscode/tasks.json
  "version": "2.0.0",
  "tasks": [
    {
      "label": "build:gcc",
      "type": "shell",
      "command": "/usr/bin/g++",
      "args": ["-std=c++17", "-O0", "-g", "src/main.cpp", "-o", "build/app_gcc"],
      "group": { "kind": "build", "isDefault": false },
      "problemMatcher": ["$gcc"]
    },
    {
      "label": "build:clang",
      "type": "shell",
      "command": "/usr/bin/clang++",
      "args": ["-std=c++17", "-O0", "-g", "src/main.cpp", "-o", "build/app_clang"],
      "group": "build",
      "problemMatcher": ["$gcc"]
    },
    {
      "label": "build:msvc",
      "type": "shell",
      "windows": {
        // Developer Command Prompt もしくは vcvars 呼び出しが前提
        "command": "cl.exe",
        "args": ["/std:c++17", "/Zi", "/EHsc", "src\\main.cpp", "/Fe:build\\app_msvc.exe"]
      },
      "group": "build",
      "problemMatcher": ["$msCompile"]
    }
  ]
}
<h3>方法3:タスクの <code>inputs</code> で“その場選択”</h3>
<p>ビルド実行のたびに候補リストからコンパイラを選ぶ方式。メンバー全員が同じテンプレートを共有しやすく、<strong>環境差</strong>を吸収できます。</p>
{
  // .vscode/tasks.json
  "version": "2.0.0",
  "inputs": [
    {
      "id": "compiler",
      "type": "pickString",
      "description": "使用するコンパイラを選択",
      "options": [
        "/usr/bin/g++",
        "/usr/bin/clang++",
        "C:\\\\msys64\\\\mingw64\\\\bin\\\\g++.exe",
        "cl.exe"
      ]
    }
  ],
  "tasks": [
    {
      "label": "build:pick",
      "type": "shell",
      "command": "${input:compiler}",
      "args": [
        "-std=c++20", "-O0", "-g",
        "src/main.cpp",
        "-o", "build/app"
      ],
      "group": { "kind": "build", "isDefault": true },
      "problemMatcher": ["$gcc", "$msCompile"]
    }
  ]
}
<p><strong>cl.exe</strong>を選ぶ可能性があるなら、VS&nbsp;CodeをDeveloper&nbsp;Command&nbsp;Promptから起動するか、次の「方法4」で環境設定を自動化しましょう。</p>

<h3>方法4:CMake Tools/Makefile Toolsなど拡張でワンセット切替</h3>
<ul>
  <li><strong>CMake Tools</strong>:<em>Kit</em>の概念でGCC/Clang/MSVCを切り替え。<code>preLaunchTask</code>・デバッガ・IntelliSense(<code>compile_commands.json</code>)まで一気通貫。</li>
  <li><strong>Makefile Tools・meson-vscode</strong>など:ビルドシステムに合わせて最適なコンパイラを自動選択し、引数も同期。</li>
</ul>

環境別・即使えるテンプレート集

Linux/WSL/macOS:GCC/Clang + gdb/lldb

まずは最小構成。build/配下に成果物を吐き出し、gdb/lldbで起動します。

{
  // .vscode/settings.json
  "C_Cpp.default.compilerPath": "/usr/bin/g++",
  "C_Cpp.default.intelliSenseMode": "gcc-x64",
  "C_Cpp.default.cppStandard": "c++17",
  "C_Cpp.default.cStandard": "c17"
}
{
  // .vscode/tasks.json
  "version": "2.0.0",
  "tasks": [
    {
      "label": "build:gcc-debug",
      "type": "shell",
      "command": "/usr/bin/g++",
      "args": ["-std=c++17", "-g", "-O0", "src/main.cpp", "-o", "build/app"],
      "group": { "kind": "build", "isDefault": true },
      "problemMatcher": ["$gcc"]
    }
  ]
}
{
  // .vscode/launch.json
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Debug (gdb)",
      "type": "cppdbg",
      "request": "launch",
      "program": "${workspaceFolder}/build/app",
      "args": [],
      "cwd": "${workspaceFolder}",
      "stopAtEntry": false,
      "MIMode": "gdb",
      "miDebuggerPath": "/usr/bin/gdb",
      "preLaunchTask": "build:gcc-debug",
      "console": "integratedTerminal"
    }
  ]
}

macOSでClangを使う場合は、settings.jsonのintelliSenseModeをclang-x64に、デバッガをlldbに切り替えます。

<h3>Windows:MinGW-w64(MSYS2) + gdb</h3>
{
  // .vscode/settings.json
  "C_Cpp.default.compilerPath": "C:/msys64/mingw64/bin/g++.exe",
  "C_Cpp.default.intelliSenseMode": "gcc-x64",
  "C_Cpp.default.cppStandard": "c++20"
}
{
  // .vscode/tasks.json
  "version": "2.0.0",
  "tasks": [
    {
      "label": "build:mingw",
      "type": "shell",
      "command": "C:/msys64/mingw64/bin/g++.exe",
      "args": [
        "-std=c++20", "-O0", "-g",
        "src/main.cpp",
        "-o", "build/app_mingw.exe"
      ],
      "options": { "cwd": "${workspaceFolder}" },
      "problemMatcher": ["$gcc"],
      "group": "build"
    }
  ]
}
{
  // .vscode/launch.json
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Debug (gdb / MinGW)",
      "type": "cppdbg",
      "request": "launch",
      "program": "${workspaceFolder}/build/app_mingw.exe",
      "cwd": "${workspaceFolder}",
      "MIMode": "gdb",
      "miDebuggerPath": "C:/msys64/mingw64/bin/gdb.exe",
      "preLaunchTask": "build:mingw",
      "console": "integratedTerminal"
    }
  ]
}
<h3>Windows:MSVC(cl.exe) + Visual Studio Windows Debugger(cppvsdbg)</h3>
<p><strong>vcvars</strong>(環境初期化)をタスクで自動実行してからビルドするテンプレートです。VS&nbsp;Codeは通常のコマンドプロンプトで起動してOK。</p>
{
  // .vscode/settings.json
  "C_Cpp.default.compilerPath": "C:/Program Files/Microsoft Visual Studio/2022/BuildTools/VC/Tools/MSVC/<バージョン>/bin/Hostx64/x64/cl.exe",
  "C_Cpp.default.intelliSenseMode": "msvc-x64",
  "C_Cpp.default.cppStandard": "c++20"
}
{
  // .vscode/tasks.json
  "version": "2.0.0",
  "tasks": [
    {
      "label": "env:vcvars64",
      "type": "shell",
      "windows": {
        "command": "cmd.exe",
        "args": ["/C", "\"call \"%ProgramFiles(x86)%\\Microsoft Visual Studio\\2022\\BuildTools\\VC\\Auxiliary\\Build\\vcvars64.bat\" && set\""],
        "options": { "cwd": "${workspaceFolder}" }
      },
      "problemMatcher": []
    },
    {
      "label": "build:msvc",
      "type": "shell",
      "dependsOn": "env:vcvars64",
      "windows": {
        "command": "cmd.exe",
        "args": ["/C", "\"cl.exe /std:c++20 /Zi /EHsc src\\main.cpp /Fe:build\\app_msvc.exe\""]
      },
      "group": { "kind": "build", "isDefault": true },
      "problemMatcher": ["$msCompile"]
    }
  ]
}
{
  // .vscode/launch.json
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Debug (MSVC / cppvsdbg)",
      "type": "cppvsdbg",
      "request": "launch",
      "program": "${workspaceFolder}/build/app_msvc.exe",
      "args": [],
      "cwd": "${workspaceFolder}",
      "preLaunchTask": "build:msvc",
      "console": "integratedTerminal",
      "stopAtEntry": false
    }
  ]
}
<p><em>ヒント</em>:<code>clang-cl.exe</code>を使う場合は<code>compilerPath</code>をそのフルパスに、<code>intelliSenseMode</code>はMSVC系(例:<code>msvc-x64</code>)を選ぶとヘッダ解決の整合性が取りやすくなります。</p>

IntelliSenseの正確さを最大化する設定ポイント

  • compilerPathを必ずフルパス指定:紛らわしい同名バイナリ(例:複数のMinGW)がPATHにあると誤検出が起きやすい。
  • intelliSenseModeを明示:gcc-x64/clang-x64/msvc-x64など、実際のツールチェーンに合わせる。
  • 言語規格:cStandard(例:c17)・cppStandard(例:c++20)を明示。
  • compile_commands.jsonの活用:CMakeやMesonで出力されるcompile_commands.jsonをC_Cpp.default.compileCommandsに設定すると、実ビルドと同じフラグ・定義で解析され、誤検知が激減。
  • includePathは最小限に:compilerPathとcompileCommandsで足りるなら、手動のincludePathは不要。重複定義は混乱のもと。
{
  // .vscode/settings.json(解析の黄金パターン)
  "C_Cpp.default.compilerPath": "/usr/bin/clang++",
  "C_Cpp.default.intelliSenseMode": "clang-x64",
  "C_Cpp.default.cppStandard": "c++20",
  "C_Cpp.default.compileCommands": "${workspaceFolder}/build/compile_commands.json"
}

launch.jsonのキモ:デバッガ種別とパスの整合

ツールチェーンデバッガ設定主なキー注意点
GCC(Linux/WSL/MinGW)type: "cppdbg" / MIMode: "gdb"miDebuggerPath=gdbのパスMinGWとCygwinのgdbは混ぜない。実行ファイルとgdbのABIが合うこと。
Clang(macOS)type: "cppdbg" / MIMode: "lldb"miDebuggerPath=lldb権限やSIPの影響で最初のアタッチに承認が必要な場合あり。
MSVC(Windows)type: "cppvsdbg"特別なキーは少ないシンボル生成オプション(/Zi)をビルドに入れる。vcvars済み環境が安定。
clang-cl(Windows)MSVCと同様にcppvsdbgが使いやすい—ランタイムがMSVC寄りになるため、gdbよりcppvsdbgの方が快適。

よくあるトラブルと対処集(原因別チェックリスト)

「ビルドは通るのに、IntelliSenseの波線が消えない」

  • 解析用コンパイラ(settings.jsonのcompilerPath)と実ビルド(tasks.json)の食い違いを確認。
  • intelliSenseModeと実ツールチェーンを一致させる。
  • compile_commands.jsonを使えるなら導入して同期。
<h3>「別のMinGWが勝手に使われる/gdbが動かない」</h3>
<ul>
  <li><code>compilerPath</code>・<code>gdb</code>の<strong>フルパス指定</strong>で固定。</li>
  <li>環境変数<strong>PATH</strong>の並び順を見直し。古いMinGWを除外。</li>
  <li>MinGW版とCygwin版のgdbは混ぜない(実行ファイルとgdbは同系列)。</li>
</ul>

<h3>「Windowsでcl.exeが見つからない/ヘッダが解決しない」</h3>
<ul>
  <li>Developer&nbsp;Command&nbsp;PromptからVS&nbsp;Codeを起動(環境変数が整う)。</li>
  <li>もしくは本稿の<em>vcvars呼び出しタスク</em>を導入。</li>
  <li><code>intelliSenseMode</code>は<code>msvc-x64</code>等を選ぶ。</li>
</ul>

<h3>「launch.jsonでデバッガが止まる/プロセスが見つからない」</h3>
<ul>
  <li><code>program</code>のパスがビルド成果物と一致しているか。</li>
  <li><code>preLaunchTask</code>が正しく成功しているか。</li>
  <li><code>externalConsole</code>/<code>console</code>の指定(統合ターミナルか外部コンソールか)を用途に合わせて調整。</li>
</ul>

<h3>「WSLとWindowsを取り違える」</h3>
<ul>
  <li>WSLで開いたフォルダは<strong>WSL内</strong>のコンパイラ・gdbを使う(パスは<code>/usr/bin/...</code>)。</li>
  <li>Windows側のMinGWやMSVCと混ぜない。Remote拡張の接続先を確認。</li>
</ul>

“編集・ビルド・デバッグ”を同期させる設計パターン

  1. 編集(IntelliSense):settings.jsonにcompilerPath・intelliSenseMode・規格を明示。可能ならcompile_commands.jsonでビルドの実態を反映。
  2. ビルド:tasks.jsonにコンパイラごとのタスクを用意。inputsによる選択式や、dependsOnで環境初期化タスクを連鎖。
  3. デバッグ:launch.jsonでpreLaunchTaskを指し、デバッガ種別(gdb/lldb/cppvsdbg)を正しく選ぶ。

この三層を分離しつつ連携させるのが、混乱を防ぐ最短ルートです。

より深く:設定の拡張とチーム開発のベストプラクティス

ユーザー設定 vs ワークスペース設定

  • ユーザー設定(グローバル)にcompilerPathを書いた場合:新規プロジェクトの初期値として便利。ただしチーム開発では環境差が出やすい。
  • ワークスペース設定(.vscode/settings.json)に限定:プロジェクト単位でコンパイラを固定でき、再現性が高い。
<h3>問題マッチャー(problemMatcher)でエラー表示を整える</h3>
<p>コンパイラの種類に合わせて、<code>$gcc</code>/<code>$msCompile</code>などを設定。独自のビルドスクリプトでも正確にエラー行へジャンプできます。</p>

<h3>タスクの変数と条件分岐</h3>
{
  // OSごとに切り替える例
  "tasks": [
    {
      "label": "build:auto",
      "type": "shell",
      "linux": { "command": "/usr/bin/g++" },
      "osx":   { "command": "/usr/bin/clang++" },
      "windows": { "command": "C:/msys64/mingw64/bin/g++.exe" },
      "args": ["-g", "src/main.cpp", "-o", "build/app"]
    }
  ]
}
<h3>コンパイルオプションの管理</h3>
<p>デバッグとリリースでフラグを分けるのは基本です。タスクを二つに分け、<code>-O0 -g</code>と<code>-O2 -DNDEBUG</code>などを切り替えましょう。</p>

<h3>ABI・ランタイムの整合</h3>
<ul>
  <li><strong>MinGW</strong>と<strong>MSVC</strong>で生成したライブラリの混用は避ける。</li>
  <li><strong>clang-cl</strong>はMSVC互換のフロントエンド。IntelliSenseはMSVCモードと親和性が高い。</li>
  <li><strong>WSL</strong>の成果物はLinuxバイナリ。Windowsネイティブとは別物。</li>
</ul>

“毎回選ぶ”をもっとスマートに:高度な切り替え術

1)ビルド前にコンパイラ選択ダイアログを出す(入力統合)

inputsと変数を応用し、preLaunchTaskからも選択を共有します。

{
  // .vscode/tasks.json(コンパイラ選択を1回で共有)
  "version": "2.0.0",
  "inputs": [
    {
      "id": "cc",
      "type": "pickString",
      "description": "コンパイラを選択",
      "options": [
        "/usr/bin/g++",
        "/usr/bin/clang++",
        "C:/msys64/mingw64/bin/g++.exe",
        "cl.exe"
      ]
    }
  ],
  "tasks": [
    {
      "label": "build:smart",
      "type": "shell",
      "command": "${input:cc}",
      "args": ["-std=c++20", "-g", "src/main.cpp", "-o", "build/app_smart"],
      "problemMatcher": ["$gcc", "$msCompile"],
      "group": "build"
    }
  ]
}
{
  // .vscode/launch.json(preLaunchTaskと同じ入力が再利用される)
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Debug (smart)",
      "type": "cppdbg",
      "request": "launch",
      "program": "${workspaceFolder}/build/app_smart",
      "cwd": "${workspaceFolder}",
      "MIMode": "gdb",
      "miDebuggerPath": "/usr/bin/gdb",
      "preLaunchTask": "build:smart"
    }
  ]
}

Windowsでcl.exeを選ぶ可能性がある場合、build:smartの前段にvcvars実行タスクをdependsOnで繋げることで安定動作します。

<h3>2)CMake Toolsで<strong>キット(Kit)</strong>選択</h3>
<p>プロジェクトがCMakeなら、<em>Kit</em>でコンパイラを切り替え、<code>compile_commands.json</code>も自動生成。IntelliSense・ビルド・デバッグが常に同期します。チームでの再現性が最も高い方式です。</p>

<h3>3)Makefile Tools/Meson拡張の活用</h3>
<p>既存のMakefileやMesonプロジェクトでは、拡張がターゲットやコンパイラを自動認識。<code>make CC=clang</code>のような切り替えもUIから行えます。</p>

サンプルプロジェクト:最小のC++アプリで全体像を掴む

ディレクトリ構造

your-project/
├─ .vscode/
│  ├─ settings.json
│  ├─ tasks.json
│  └─ launch.json
├─ src/
│  └─ main.cpp
└─ build/   // 生成物を置く
<h3>main.cpp</h3>
#include &lt;iostream&gt;

int main() {
  std::cout &lt;&lt; "Hello, VS Code C++!" &lt;&lt; std::endl;
  return 0;
}
<h3>操作手順</h3>
<ol>
  <li>コマンドパレットから<strong>「C/C++: Select IntelliSense Configuration」</strong>を実行し、参照用コンパイラ(<em>settings.json</em>の<code>compilerPath</code>)を選択。</li>
  <li><kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>B</kbd>でビルドタスクを実行(テンプレートに応じてコンパイラを選択)。</li>
  <li>F5でデバッグ開始。<code>preLaunchTask</code>が走り、成果物を指定のデバッガで起動。</li>
</ol>
<p>これで<strong>編集(IntelliSense)→ビルド→デバッグ</strong>の一連の流れが明確になります。</p>

OS別の要点まとめ

OS推奨コンパイラデバッガcompilerPath例注意点
WindowsMSVC / MinGW-w64 / clang-clcppvsdbg / gdbMSVC:.../cl.exe
MinGW:C:/msys64/mingw64/bin/g++.exe
vcvars初期化・複数MinGWの混在・改行コードとパス区切りを意識。
WSLGCC / Clanggdb / lldb/usr/bin/g++ / /usr/bin/clang++WSL側のファイルシステムでビルド。Windowsのgdb等とは混ぜない。
LinuxGCC / Clanggdb / lldb/usr/bin/g++ / /usr/bin/clang++ディストリごとのツールチェーン差(libstdc++のバージョン等)に注意。
macOSClanglldb/usr/bin/clang++初回のデバッグで権限ダイアログが出る場合がある。

さらに使いこなす:応用Tips

  • ビルド出力の分離:build/の下にgcc/clang/msvcなどサブディレクトリを作り、複数成果物を共存。「切り替え検証」に便利。
  • タスクのチェーン:dependsOnでコード生成→ビルド→テスト→パッケージの順に自動化。
  • 環境ファイル:.envに定義した変数を${env:VAR}としてtasks.jsonやlaunch.jsonで参照。プロキシや追加ライブラリパスに有効。
  • デバッガ拡張コマンド:gdbのpretty printers設定はsetupCommandsに書いておくと毎回適用される。
  • マルチルートワークスペース:ルートごとに.vscode/を持たせ、異なるコンパイラ・規格を共存させる。
  • CIとの整合:ローカルのtasks.jsonとCIのビルドコマンドを合わせると、リリース前検証が容易。

まとめ:混乱しない思考法

VS CodeのC/C++開発は、編集(IntelliSense)・ビルド・デバッグという三層を分けて捉えると整理できます。IntelliSenseはsettings.jsonで「何を参照するか」を決め、ビルドはtasks.jsonで「何を実行するか」を決め、デバッグはlaunch.jsonで「どう起動するか」を決める。
この原則さえ押さえれば、GCC/Clang/MSVCを自由自在に切り替えつつ、再現性の高い開発体験を全員で共有できます。迷ったときは、compilerPathは解析用、commandはビルド用、デバッガ種別は実行時の相棒——この3点を思い出してください。

付録:具体的な設定スニペット集

GCCとClangを同居させる(成果物名で識別)

{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "build:gcc-out",
      "type": "shell",
      "command": "/usr/bin/g++",
      "args": ["-g", "-O0", "src/main.cpp", "-o", "build/gcc/app"],
      "group": "build",
      "problemMatcher": ["$gcc"]
    },
    {
      "label": "build:clang-out",
      "type": "shell",
      "command": "/usr/bin/clang++",
      "args": ["-g", "-O0", "src/main.cpp", "-o", "build/clang/app"],
      "group": "build",
      "problemMatcher": ["$gcc"]
    }
  ]
}
<h3>gdbに便利な設定</h3>
{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Debug (gdb, pretty)",
      "type": "cppdbg",
      "request": "launch",
      "program": "${workspaceFolder}/build/app",
      "cwd": "${workspaceFolder}",
      "MIMode": "gdb",
      "miDebuggerPath": "/usr/bin/gdb",
      "setupCommands": [
        { "text": "-enable-pretty-printing" },
        { "text": "handle SIGPIPE nostop noprint pass" }
      ],
      "preLaunchTask": "build:gcc-debug"
    }
  ]
}
<h3>clang-cl(MSVCランタイム)</h3>
{
  "C_Cpp.default.compilerPath": "C:/Program Files/LLVM/bin/clang-cl.exe",
  "C_Cpp.default.intelliSenseMode": "msvc-x64",
  "C_Cpp.default.cppStandard": "c++20"
}

FAQ:細かいけれど効く知見

Q. c_cpp_properties.jsonは使わないの? A. 最近はC_Cpp.default.*をsettings.jsonに置く流れが主流。既存プロジェクトでc_cpp_properties.jsonがあっても共存は可能ですが、重複設定は避けてください。

  <dt>Q. <code>compilerPath</code>と<code>includePath</code>の関係は?</dt>
  <dd>A. <code>compilerPath</code>が分かれば、拡張が標準インクルードの探索経路や定義済みマクロを推定できます。手動の<code>includePath</code>は最小限に。</dd>

  <dt>Q. <code>gnu++2x</code>や<code>c++23</code>を使いたい</dt>
  <dd>A. <code>cppStandard</code>に<code>c++23</code>(または利用可能な最新)を設定し、ビルド側の<code>-std=</code>オプションと揃えてください。</dd>

  <dt>Q. <code>clang</code>と<code>clang-cl</code>の違いは?</dt>
  <dd>A. <code>clang</code>/<code>clang++</code>はGCC互換のコマンドライン、<code>clang-cl</code>はMSVC互換のフロントエンド。WindowsでMSVCのエコシステムに寄せたいなら<code>clang-cl</code>が便利です。</dd>

  <dt>Q. <code>cppdbg</code>と<code>cppvsdbg</code>の違いは?</dt>
  <dd>A. <code>cppdbg</code>はMI(gdb/lldb)プロトコル系、<code>cppvsdbg</code>はVisual StudioのWindowsデバッガ。MSVCやclang-clでのWindowsネイティブデバッグには<code>cppvsdbg</code>が快適です。</dd>
</dl>

実運用のチェックリスト(コピペ可)

  • [ ] 参照用コンパイラ:settings.jsonのC_Cpp.default.compilerPathをフルパスで固定したか?
  • [ ] 解析モード:intelliSenseMode(gcc/clang/msvc)を実ツールチェーンと一致させたか?
  • [ ] ビルド:tasks.jsonに複数タスク or inputs選択を用意したか?
  • [ ] デバッグ:launch.jsonで正しいデバッガ(gdb/lldb/cppvsdbg)を選んだか?
  • [ ] WindowsのMSVC:Developer Prompt起動 or vcvarsタスクで初期化しているか?
  • [ ] compile_commands.json:ビルドとIntelliSenseの同期に使えるなら設定したか?
  • [ ] PATH汚染回避:同名コンパイラが複数あるならフルパス指定で封じたか?

結論:compilerPathは“解析の舵取り役”、ビルドはタスクが本番

本記事で示した通り、compilerPathはIntelliSenseの精度に直結する「参照用コンパイラ」の宣言であり、実際のビルドはtasks.jsonのcommandで決まります。launch.jsonはその成果物をどうデバッグするかの仕様を司り、preLaunchTaskでビルドと連動します。
この三位一体の設計を理解すれば、GCC/Clang/MSVCをプロジェクトや用途ごとに柔軟に切り替えながら、ストレスの少ないC/C++開発を実現できます。


この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次