C言語GUI入門|#include <gtk/gtk.h>のincludePathエラー

このエラーは、VS Code の C/C++拡張機能(IntelliSense)が gtk/gtk.h の場所を見つけられていないときに表示されます。

GTK 4をMSYS2のUCRT64にインストールしている場合、gtk.h は通常、

C:\msys64\ucrt64\include\gtk-4.0\gtk\gtk.h

にあります。MSYS2公式でも、UCRT64版GTK 4は /ucrt64/include/gtk-4.0 以下にヘッダーファイルを配置しています。

まず、GTK 4の問題なのか、VS Codeだけの問題なのかを確認しましょう。

フォルダごとに設定する

ここで紹介する方法は、VSCodeで開くフォルダごとに行う必要があります。

1. MSYS2 UCRT64 Bashを開く

VS Codeのターミナルを MSYS2 UCRT64 Bash にしてください。

次を実行します。

echo $MSYSTEM

次のようになればOKです。

UCRT64

MSYS2でも、GTK 4の開発ではUCRT64環境を利用できます。

2. GTK 4がインストールされているか確認する

次を実行してください。

pkg-config --modversion gtk4

たとえば、

4.22.4

のようにバージョン番号が表示されれば、GTK 4は認識されています。

さらに、

ls /ucrt64/include/gtk-4.0/gtk/gtk.h

を実行します。

次のように表示されれば問題ありません。

/ucrt64/include/gtk-4.0/gtk/gtk.h

もし、

No such file or directory

となる場合はGTK 4をインストールします。

pacman -S mingw-w64-ucrt-x86_64-gtk4

これがUCRT64版GTK 4の公式パッケージ名です。

3. 実際にコンパイルできるか確認する

たとえば hello_gtk.c があるディレクトリへ移動して、

gcc hello_gtk.c -o hello_gtk.exe $(pkg-config --cflags --libs gtk4)

を実行してください。

コンパイルできる場合

ここが重要です。

コンパイルできるのにVS Codeで赤い波線が出る場合、GTK 4には問題ありません。

問題は、

#include <gtk/gtk.h>

をVS CodeのIntelliSenseが見つけられていないことです。

つまり、

GCC        → gtk/gtk.h を見つけられる
VS Code    → gtk/gtk.h を見つけられない

という状態です。

4. VS Codeの c_cpp_properties.json を設定する

VS Codeで

Ctrl + Shift + P

を押します。

そして、検索窓から「C/C++: Edit Configurations (JSON)」を入力して検索します。

C/C++: Edit Configurations (JSON)

を選択してください。

プロジェクトの

.vscode
    └─ c_cpp_properties.json

を編集します。

たとえば C:\cgui をVS Codeで開いている場合、

C:\cgui
   ├─ .vscode
   │   └─ c_cpp_properties.json
   ├─ chap04
   ├─ chap05
      ...

という構成になります。

まず次の設定を試してください。

{
    "configurations": [
        {
            "name": "MSYS2 UCRT64",
            "includePath": [
                "${workspaceFolder}/**",
                "C:/msys64/ucrt64/include/**",
                "C:/msys64/ucrt64/lib/glib-2.0/include",
                "C:/msys64/ucrt64/lib/graphene-1.0/include",
                "C:/msys64/ucrt64/include/gtk-4.0",
                "C:/msys64/ucrt64/include/glib-2.0",
                "C:/msys64/ucrt64/include/cairo",
                "C:/msys64/ucrt64/include/pango-1.0",
                "C:/msys64/ucrt64/include/harfbuzz",
                "C:/msys64/ucrt64/include/gdk-pixbuf-2.0",
                "C:/msys64/ucrt64/include/graphene-1.0"
            ],
            "defines": [
                "_DEBUG",
                "UNICODE",
                "_UNICODE"
            ],
            "windowsSdkVersion": "10.0.26100.0",
            "compilerPath": "C:/msys64/ucrt64/bin/gcc.exe",
            "cStandard": "c17",
            "cppStandard": "c++17",
            "intelliSenseMode": "windows-gcc-x64"
        }
    ],
    "version": 4
}

特に重要なのが、

"compilerPath": "C:/msys64/ucrt64/bin/gcc.exe"

です。

VS Codeに、

このプロジェクトではMSYS2 UCRT64のGCCを使っています

と教える設定になります。

また、

"C:/msys64/ucrt64/include/**"

によって、GTK 4を含むUCRT64側のヘッダーをIntelliSenseの検索対象にします。

5. より確実に設定したい場合

GTK 4では、実際には gtk-4.0 だけでなくGLib、Pango、Cairoなど複数のインクルードディレクトリを使用します。

MSYS2 UCRT64 Bashで、

pkg-config --cflags gtk4

を実行してください。

たとえば次のような大量の情報が表示されます。

-IC:/msys64/ucrt64/include/gtk-4.0
-IC:/msys64/ucrt64/include/pango-1.0
-IC:/msys64/ucrt64/include
-IC:/msys64/ucrt64/include/harfbuzz
-IC:/msys64/ucrt64/include/freetype2
-IC:/msys64/ucrt64/include/cairo
...
-IC:/msys64/ucrt64/include/glib-2.0
-IC:/msys64/ucrt64/lib/glib-2.0/include

pkg-config は、GTK 4をコンパイルするために必要なインクルードパスをこのように出力する仕組みです。MSYS2ではUCRT64環境のpkg-configが /ucrt64/include や /ucrt64/lib/pkgconfig を認識するよう設定されています。

この情報をVS Codeにも教えると、IntelliSenseがより正確になります。

6. 設定後にVS Codeを再読み込みする

c_cpp_properties.json を保存したら、

Ctrl + Shift + P

から

Developer: Reload Window

を実行してください。

それでも赤線が残る場合は、

Ctrl + Shift + P

から

C/C++: Reset IntelliSense Database

を実行します。

そのあと hello_gtk.c を開き直します。

7. gtk/gtk.h の書き方は変更しない

ここも重要です。

現在、

#include <gtk/gtk.h>

としているのであれば、これは正しい書き方です。

次のように変更する必要はありません。

#include <gtk-4.0/gtk/gtk.h>

これはおすすめしません。

正しくは、

#include <gtk/gtk.h>

のまま、

C:\msys64\ucrt64\include\gtk-4.0

をインクルード検索対象にします。

つまり、

C:\msys64\ucrt64\include\gtk-4.0
                ↓
              gtk
                ↓
             gtk.h

なので、

#include <gtk/gtk.h>

で見つかるわけです。

今回の環境でおすすめする確認順序

C言語GUI教材で使用している Windows + MSYS2 + UCRT64 + GCC + GTK 4 + VS Code の構成なら、次の順番で確認するのがおすすめです。

① UCRT64か確認
       ↓
echo $MSYSTEM
       ↓
② GTK 4を確認
       ↓
pkg-config --modversion gtk4
       ↓
③ gtk.hを確認
       ↓
ls /ucrt64/include/gtk-4.0/gtk/gtk.h
       ↓
④ GCCでコンパイル
       ↓
gcc hello_gtk.c -o hello_gtk.exe \
    $(pkg-config --cflags --libs gtk4)
       ↓
⑤ コンパイル成功
       ↓
VS CodeのIntelliSenseだけの問題
       ↓
⑥ c_cpp_properties.jsonを設定

特に、④のコンパイルが成功するかどうかを確認してください。

もし

gcc hello_gtk.c -o hello_gtk.exe $(pkg-config --cflags --libs gtk4)

では正常にコンパイルできるのに、

ソース ファイルを開けません "gtk/gtk.h"

だけがVS Code上に表示されているのであれば、GTK 4のインストールは正常で、VS CodeのincludePath設定を直せばよい可能性が非常に高いです。

今回の教材環境なら、まず上の c_cpp_properties.json の設定を入れる方法を試してみるとよいでしょう。