VSCodeで「includePathを更新してください」と表示される原因と対処法

採用はこちら

VSCodeでCやC++のコードを書いていると、#includeの行に赤い波線が表示され、「インクルード エラーが検出されました。includePath を更新してください。」といったメッセージが出ることがあります。

このメッセージは、多くの場合、MicrosoftのC/C++拡張機能が使用するIntelliSenseが、#includeで指定されたヘッダーファイルを正しく見つけられていないときに表示されます。

ただし、必ずしもincludePathだけに原因があるとは限りません。

コンパイラの設定やプロジェクト構成、CMakeなどのビルドシステムとの連携が原因になっていることもあります。

そのため、「includePathを更新してください」と表示された場合は、原因を順番に切り分けて確認することが重要です。

目次

includePathとは?

ヘッダーファイルを検索する場所を指定する設定

CやC++では、次のように#includeを使ってヘッダーファイルを読み込みます。

#include <iostream>
#include <vector>
#include "sample.h"

VSCodeのC/C++拡張機能は、IntelliSenseを動作させるために、これらのヘッダーファイルがどこにあるのかを確認します。

その検索先を指定する設定の一つがincludePathです。

例えば、次のようなプロジェクトがあるとします。

project/
├─ src/
│  └─ main.cpp
├─ include/
│  └─ sample.h
└─ .vscode/
   └─ c_cpp_properties.json

main.cppで次のように記述しているとします。

#include "sample.h"

このとき、VSCodeがincludeフォルダを検索対象として認識していなければ、sample.hを見つけられない場合があります。

その結果、#includeの部分に赤い波線が表示されることがあります。

「includePathを更新してください」と表示される主な原因

ヘッダーファイルの場所がincludePathに含まれていない

もっとも分かりやすい原因は、使用したいヘッダーファイルが存在するディレクトリをIntelliSenseが認識していないことです。

例えば、次の場所にヘッダーファイルがあるとします。

project/
└─ libs/
   └─ sample/
      └─ include/
         └─ sample.h

コードでは次のように記述します。

#include "sample.h"

しかし、VSCodeが次のディレクトリを検索していなければ、ファイルを見つけられません。

project/libs/sample/include

この場合は、対象ディレクトリをincludePathに追加することで解決できる可能性があります。

compilerPathが適切に設定されていない

標準ライブラリまで認識されない場合は、includePathより先にcompilerPathを確認することが重要です。

compilerPathには、GCCやClang、MSVCなど、実際に使用するコンパイラの場所を指定します。

C/C++拡張機能は、指定されたコンパイラからシステムインクルードパスやプリプロセッサ定義などの情報を取得します。

そのため、次のような標準ライブラリにまで赤線が表示される場合は、コンパイラ設定を疑った方がよいでしょう。

#include <iostream>
#include <vector>
#include <string>

WindowsでMinGWを使用している場合は、例えば次のような設定になります。

"compilerPath": "C:/msys64/mingw64/bin/g++.exe"

LinuxでG++を使用している場合は、次のような設定が考えられます。

"compilerPath": "/usr/bin/g++"

macOSでClangを使用する場合は、次のようになります。

"compilerPath": "/usr/bin/clang++"

実際のパスは使用している環境によって異なります。

コンパイラがインストールされていない

VSCode本体やC/C++拡張機能には、CやC++のコンパイラそのものは含まれていません。

そのため、C/C++拡張機能をインストールしただけでは、完全な開発環境にならない場合があります。

Windowsでは、例えば次のようなコンパイラを利用できます。

  • MSVC
  • MinGW-w64
  • Clang

LinuxではGCCやClangが一般的です。

macOSではClangがよく利用されます。

コンパイラが正しく導入されていない場合、VSCode側でもシステムヘッダーを正しく認識できないことがあります。

VSCodeで開いているフォルダが適切ではない

VSCodeでは、ワークスペースとして開いているフォルダを${workspaceFolder}という変数で参照できます。

例えば、本来は次のフォルダを開くべきだとします。

C:\projects\sample

しかし、誤って次のフォルダだけをVSCodeで開いていたとします。

C:\projects\sample\src

この状態で次の設定を行うとします。

"includePath": [
    "${workspaceFolder}/include"
]

すると、VSCodeは次の場所を検索します。

C:\projects\sample\src\include

しかし、本来のヘッダーファイルが次の場所にある場合は一致しません。

C:\projects\sample\include

そのため、${workspaceFolder}がどこを指しているかを確認することも重要です。

外部ライブラリのヘッダーパスが認識されていない

OpenCVやBoostなどの外部ライブラリを使用している場合も、同じ問題が起こることがあります。

例えば、OpenCVを使うコードでは次のように記述します。

#include <opencv2/opencv.hpp>

実際のビルドではOpenCVのインクルードパスが設定されていても、VSCodeのIntelliSense側にその情報が伝わっていないと、赤い波線が表示されることがあります。

この場合は、外部ライブラリのヘッダーディレクトリをincludePathに追加するか、ビルドシステムからIntelliSenseへ設定を連携します。

CMakeなどのビルド設定とIntelliSense設定が一致していない

CMakeを使用しているプロジェクトでは、インクルードパスがCMakeLists.txtで設定されていることがあります。

例えば、次のような設定です。

target_include_directories(
    MyApp
    PRIVATE
    ${CMAKE_SOURCE_DIR}/include
)

この設定によって実際のビルドは成功していても、VSCodeのIntelliSenseが同じ情報を把握していない場合があります。

その結果、「コンパイルは成功するのにVSCodeでは赤線が表示される」という状態になることがあります。

このような場合は、includePathを手動で増やすよりも、compile_commands.jsonやCMake Toolsなどを利用して、ビルド設定とIntelliSenseを連携させる方法が適しています。

対処法1:正しいコンパイラを選択する

IntelliSense Configurationを設定する

まず確認したいのが、VSCodeのC/C++拡張機能が正しいコンパイラを使用しているかどうかです。

コマンドパレットを開きます。

WindowsやLinuxでは、次のショートカットを利用できます。

Ctrl + Shift + P

その後、次のコマンドを検索します。

C/C++: Select IntelliSense Configuration

利用可能なコンパイラが表示されたら、実際に使用しているものを選択します。

例えば、次のようなコンパイラです。

gcc
g++
clang
clang++
cl.exe

適切なコンパイラを選択すると、C/C++拡張機能が標準ライブラリの場所などを認識しやすくなります。

対処法2:C/C++の設定画面を確認する

Edit Configurationsから設定する

コマンドパレットで次のコマンドを実行します。

C/C++: Edit Configurations (UI)

すると、C/C++拡張機能の設定画面が表示されます。

主に確認したいのは次の項目です。

Compiler path
Include path

例えば、プロジェクト内のincludeフォルダを認識させたい場合は、次のように設定できます。

${workspaceFolder}/include

サブディレクトリまで再帰的に検索させたい場合は、次のように指定できます。

${workspaceFolder}/include/**

対処法3:c_cpp_properties.jsonを確認する

JSONで設定を直接編集する

より細かく設定したい場合は、コマンドパレットで次のコマンドを実行します。

C/C++: Edit Configurations (JSON)

通常は次のファイルが使用されます。

.vscode/c_cpp_properties.json

例えば、MinGWを使用する場合は次のような設定になります。

{
    "configurations": [
        {
            "name": "Win32",
            "includePath": [
                "${workspaceFolder}/include/**"
            ],
            "defines": [],
            "compilerPath": "C:/msys64/mingw64/bin/g++.exe",
            "cStandard": "c17",
            "cppStandard": "c++17",
            "intelliSenseMode": "${default}"
        }
    ],
    "version": 4
}

特に確認したいのは、次の2つです。

"compilerPath"
"includePath"

ただし、c_cpp_properties.jsonは必ず手作業で作成しなければならないものではありません。

まずはコンパイラを選択し、それでも必要な場合にUIやJSONで設定を調整すると分かりやすいでしょう。

includePathの書き方

特定のフォルダだけ指定する

例えば、次のような構成だとします。

project/
├─ include/
│  └─ mylib/
│     └─ sample.h
└─ src/
   └─ main.cpp

この場合は次のように指定できます。

"includePath": [
    "${workspaceFolder}/include"
]

サブディレクトリまで再帰検索する場合は、次のようにします。

"includePath": [
    "${workspaceFolder}/include/**"
]

ワークスペース全体を検索する

小規模なプロジェクトであれば、次のような設定も可能です。

"includePath": [
    "${workspaceFolder}/**"
]

これにより、ワークスペース配下が再帰的な検索対象になります。

ただし、大規模なプロジェクトでは検索対象が増えすぎる可能性があります。

そのため、必要なディレクトリが分かっている場合は、次のように範囲を絞った方が管理しやすくなります。

"includePath": [
    "${workspaceFolder}/include/**",
    "${workspaceFolder}/src/**"
]

対処法4:compilerPathを確認する

Windowsで確認する

MinGWなどを使用している場合は、PowerShellやコマンドプロンプトで次のように確認できます。

where.exe g++

またはPowerShellでは、次の方法もあります。

Get-Command g++

例えば次のようなパスが表示されたとします。

C:\msys64\mingw64\bin\g++.exe

その場合は、compilerPathに対応するパスを設定します。

"compilerPath": "C:/msys64/mingw64/bin/g++.exe"

MSVCを使用している場合は、次のように確認できます。

where.exe cl

Linuxで確認する

Linuxでは次のコマンドが利用できます。

which g++

例えば、次の結果が表示されたとします。

/usr/bin/g++

その場合は次のように設定できます。

"compilerPath": "/usr/bin/g++"

macOSで確認する

macOSでClangを使用している場合は、次のように確認できます。

which clang++

例えば、次のように表示された場合です。

/usr/bin/clang++

その場合は次のように設定できます。

"compilerPath": "/usr/bin/clang++"

対処法5:コンパイラがインストールされているか確認する

バージョン情報を表示する

コンパイラがインストールされているか確認するには、VSCodeのターミナルなどで次のコマンドを実行します。

GCCの場合は次のとおりです。

gcc --version

G++の場合は次のとおりです。

g++ --version

Clangの場合は次のとおりです。

clang++ --version

コマンドが見つからない場合は、コンパイラがインストールされていないか、PATHが正しく設定されていない可能性があります。

対処法6:ヘッダーファイル自体を確認する

ファイル名や保存場所に間違いがないか確認する

includePathを変更する前に、対象となるファイルが本当に存在するかも確認しましょう。

例えば、コードが次のようになっているとします。

#include "sample.h"

実際にsample.hが存在するか確認します。

また、Linuxなどではファイル名の大文字と小文字が区別されます。

例えば次の2つは同じファイルではありません。

Sample.h
sample.h

単純なスペルミスや大文字・小文字の違いが原因になっているケースもあります。

「コンパイルできるのにVSCodeでは赤線が出る」理由

ビルド設定とIntelliSense設定は別に管理されることがある

C/C++では、実際のコンパイラとVSCodeのIntelliSenseが、必ずしも同じ設定を共有しているとは限りません。

例えば、次のようにコンパイルしているとします。

g++ main.cpp -I./include

-I./includeによって、G++にはincludeフォルダを検索するよう指定されています。

そのため、実際のコンパイルは成功します。

しかし、VSCodeのIntelliSenseが./includeという情報を知らなければ、次のコードに赤線が表示されることがあります。

#include "sample.h"

つまり、次の2つは分けて考える必要があります。

実際のコンパイラの設定
VSCodeのIntelliSense設定

includePathを修正してVSCodeの赤線が消えても、実際のビルド設定が変更されるわけではありません。

反対に、コンパイルが成功していてもIntelliSense側の設定が不足していれば、VSCode上ではエラーが表示される場合があります。

includePathとコンパイラの-Iオプションの関係

役割は似ているが設定先は異なる

GCCやClangでは、-Iオプションを使用してヘッダーファイルの検索先を追加できます。

例えば次のように指定します。

g++ main.cpp -I./include

一方、VSCodeのIntelliSenseでは、次のように設定できます。

"includePath": [
    "${workspaceFolder}/include"
]

考え方としてはよく似ています。

ただし、includePathは主にVSCodeのIntelliSense向けの設定です。

実際のコンパイラへ-Iオプションを自動的に追加する設定ではありません。

標準ライブラリのパスを大量に追加するのは避ける

iostreamなどが見つからない場合はcompilerPathを優先して確認する

次のような標準ライブラリが認識されない場合があります。

#include <iostream>
#include <vector>

このとき、GCC内部のディレクトリを調べてincludePathへ大量に追加する方法は、基本的にはおすすめできません。

例えば次のような設定です。

"includePath": [
    "C:/msys64/mingw64/include",
    "C:/msys64/mingw64/include/c++/...",
    "C:/msys64/mingw64/lib/gcc/..."
]

コンパイラのバージョンが変わるとパスも変化する可能性があるため、管理が難しくなります。

まずは使用するコンパイラが正しく認識されているか確認しましょう。

例えば次のように設定します。

"compilerPath": "C:/msys64/mingw64/bin/g++.exe"

適切なコンパイラが設定されていれば、C/C++拡張機能がシステムインクルードパスなどを取得できます。

CMakeを使っている場合の対処法

compile_commands.jsonを利用する

CMakeなどを使用する本格的なプロジェクトでは、includePathを手作業で管理するより、compile_commands.jsonを利用した方が適している場合があります。

compile_commands.jsonには、それぞれのソースファイルをどのコンパイルオプションでビルドするかという情報が記録されています。

CMakeでは、例えば次のようにして生成できます。

cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON ..

またはCMakeLists.txtに次の設定を追加できます。

set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

生成されたファイルをC/C++拡張機能から利用する場合は、例えば次のように設定します。

"compileCommands": "${workspaceFolder}/compile_commands.json"

これにより、実際のビルド情報とIntelliSenseの設定を合わせやすくなります。

ただし、対象ファイルに対応するエントリがcompile_commands.jsonに存在しない場合は、基本となるC/C++設定が使用される場合があります。

CMake ToolsのConfiguration Providerを利用する

CMake Toolsを使用している場合は、Configuration Providerを利用してIntelliSenseへ情報を渡すこともできます。

例えば、次のような設定があります。

"configurationProvider": "ms-vscode.cmake-tools"

この方法を使うと、CMake側のビルド設定とVSCodeのIntelliSense設定を連携しやすくなります。

複雑なCMakeプロジェクトでは、includePathを大量に手作業で管理するより適しています。

includePathとbrowse.pathの違い

includePathはIntelliSense向けの設定

includePathは、C/C++拡張機能のIntelliSenseが#includeなどを解決するときに利用します。

例えば次のように設定します。

"includePath": [
    "${workspaceFolder}/include/**"
]

通常のパス指定では再帰検索されません。

サブディレクトリまで対象にする場合は/**を利用します。

browse.pathはTag Parser向けの設定

一方、browse.pathはTag Parserがシンボル情報などを収集するために使用します。

例えば次のような設定です。

"browse": {
    "path": [
        "${workspaceFolder}"
    ]
}

browse.pathはincludePathとは役割が異なります。

また、browse.pathはデフォルトで再帰的に検索される点も違いの一つです。

「includePathを更新してください」というエラーを解決する場合は、まずincludePathやcompilerPathを確認するのが基本です。

「includePathを更新してください」が出たときの確認手順

1. エラーになっている#includeを確認する

まず、どのヘッダーファイルでエラーが出ているか確認します。

例えば次のような標準ライブラリなのかを確認します。

#include <iostream>

それとも、次のような独自ヘッダーなのかを確認します。

#include "sample.h"

標準ライブラリと独自ヘッダーでは、確認するポイントが異なります。

2. ヘッダーファイルが存在するか確認する

独自ヘッダーの場合は、対象ファイルが本当に存在するか確認します。

ファイル名のスペルや大文字・小文字も確認しましょう。

3. 標準ライブラリにも赤線があるか確認する

iostreamやvectorにも赤線が表示される場合は、includePathよりもコンパイラ設定に問題がある可能性があります。

4. コンパイラがインストールされているか確認する

次のようなコマンドで確認します。

g++ --version

または次のように確認します。

clang++ --version

5. IntelliSenseで正しいコンパイラを選択する

コマンドパレットから次の項目を実行します。

C/C++: Select IntelliSense Configuration

実際に使用するコンパイラを選択します。

6. compilerPathを確認する

使用しているコンパイラのパスと、compilerPathの設定が一致しているか確認します。

7. 独自ヘッダーのincludePathを確認する

独自ライブラリや外部ライブラリを利用している場合は、そのヘッダーディレクトリが検索対象になっているか確認します。

8. workspaceFolderを確認する

${workspaceFolder}が想定したプロジェクトルートを指しているか確認します。

9. 実際のビルド設定と比較する

GCCやClangの-Iオプション、CMakeのtarget_include_directoriesなど、実際のビルド設定とIntelliSense設定に差がないか確認します。

10. 大規模なプロジェクトではビルドシステムとの連携を検討する

CMakeなどを使用している場合は、compile_commands.jsonやConfiguration Providerを利用すると、手作業による設定ミスを減らせます。

まとめ

VSCodeで「includePathを更新してください」と表示される主な原因は、Microsoft C/C++拡張機能のIntelliSenseが#includeで指定されたヘッダーファイルを解決できていないことです。

ただし、原因が単純なincludePath不足とは限りません。

コンパイラの設定、プロジェクトの開き方、外部ライブラリ、CMakeなどのビルド設定が関係していることもあります。

特に、iostreamやvectorなどの標準ライブラリまでエラーになる場合は、includePathへパスを大量に追加する前に、正しいコンパイラが認識されているかを確認することが重要です。

独自ヘッダーだけが見つからない場合は、includePathや${workspaceFolder}の設定を確認します。

また、CMakeなどを使用した規模の大きなプロジェクトでは、includePathを手動管理するよりも、compile_commands.jsonやConfiguration Providerを利用して、実際のビルド設定とIntelliSenseを連携させる方が管理しやすくなります。

「includePathを更新してください」と表示された場合は、むやみに検索パスを追加するのではなく、どのヘッダーが見つからないのか、コンパイラが正しく設定されているか、ビルド設定とIntelliSense設定が一致しているかを順番に確認することが解決への近道です。

以上、VSCodeで「includePathを更新してください」と表示される原因と対処法についてでした。

最後までお読みいただき、ありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次