Visual Studio Code C/C++ extension の IntelliSense が MinGW の gcc で 15.2 から使えなくなった場合

C/C++拡張のIntelliSense構成時エラーがどこにも出せそうもないので、ラッパー作成してコマンドを順次とらえると最初が

g++.exe -x c++ -E -dM nul

だそうで、cmd.exeでその通りに実行してみると…

cc1plus.exe – エントリポイントが見つかりません
プロシージャエントリポイント clock_gettime64 がダイナミックリンクライブラリ c:\ProgramData\mingw64\mingw64\bin\..\libexec\gcc\x86_64-w64-mingw32\15.2.0\cc1plus.exe から見つかりませんでした。

などとexeがdll呼ばわりされた謎ダイアログが出てきます。どうやら clock_gettime64 というシステムコールのWindows実装を MinGWの libwinpthread-1.dll に追加した(2038年問題でしょうか)けれどdllのバージョンはbumpしなかったので、PATH上にある clock_gettime64 無しの libwinpthread-1.dll を読み込んだということのようです。一方でdllの検索順はexeがあるフォルダが最初なのが通常なので、こういう組み合わせの問題が起きる状況は限定的なはずです。

今回は bin/gcc.exe が呼び出す cc1plus.exe は bin/ ではなく libexec/ 以下にあるやつで、そこには libwinpthread-1.dll がないので、PATHから探し、Meldの libwinpthread-1.dll を読み込んでこの状況に陥っていました。

  • bin/gcc.exe は bin/libwinpthread-1.dll があるのでそれ読み込む。
  • libexec/…/cc1plus.exe は libexec/…/libwinpthread-1.dll がないのでPATHから探し、古いclock_gettime64()なしのlibwinpthread-1.dllも同じバージョンなのでそれを読み込んでしまう。

MinGWをMeldより前になるようにPATHを設定すればそれはそれで解決しそうです。しかしMinGWの問題をほかのアプリケーションと絡めて解決するのはすっきりしません。

libwinpthread-1.dllはMinGW特有のdllなのでおそらく本来は

  • アプリケーションマニフェストによるDLLの指定
  • libwinpthreadの前方互換性がなくなったのでバージョンをbumpする

のいずれかが本質的だと思います。こちらですぐにできることとしてはPATHを変えるよりも libexec に libwinpthread-1.dll をコピーするというのが一番副作用の影響が少なさそうなので、それでいくことにします。libexecの場所は g++ -v などとすると –libexecdir= の後ろにgccビルド時の設定が表示されます。おわり。

Visual Studio Code C/C++ extension の IntelliSense が MinGW の gcc で 15.2 から使えなくなった場合” に2件のコメントがあります

  1. ありがとうございます。助かりました。自分はucrt64にインストールのせいか少し違って、libxec ではなく lib の方でした。以下、同様の方のために書いておきます。
    ucrt64インストールでxx.x.xが15.2.0の場合
    cd x:\msys64\ucrt64\bin
    copy libwinpthread-1.dll ..\lib\gcc\x86_64-w64-mingw32\15.2.0\

    ちなみに、msys64 ucrt64 シェルからコンパイルする場合は何事もなく終わるのも理解できないです。

    1. すじ雲さん

      MSYS2の構成への対応ありがとうございました。
      > gcc -v
      ... --libexecdir=/ucrt64/lib ...

      となっていることが確認できました。

      > msys64 ucrt64 シェルからコンパイルする場合は何事もなく終わるのも理解できないです。

      こちらについては
      > echo $PATH
      /ucrt64/bin:/usr/local/bin:/usr/bin:/bin:/c/Windows/System32: ...

      のように/etc/profileで/ucrt64/bin (c:\msys64\ucrt64\bin)がPATHの先頭になるように設定されていて/ucrt64/bin/libwinpthread-1.dllが必ず読み込まれるから問題起きないのかと思います。どうでしょう。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です