msys2でucrtのランタイムを使おう!ようこそucrt64


ucrtとは

Universal CRT へのコードのアップグレード | Microsoft Docs

ここに解説があるが要約する。

まずプログラムを動かすにあたり、少なくともCのランタイムライブラリが必要になる。これはmsvcrtがこれまで用いられてきた

Visual Studio 2015でC lintimeのリファクタリングが行われ、様々な機能が追加された。例えばstrtodでの浮動小数点のパースの改善とかstd::quick_exitの対応とかそういうのだ。これをUniversal C Runtime、ucrtと呼ぶ。

msys2でもこのucrtに対応する動きが見られている。

msys2におけるucrt対応

わりとひっそりと行われている。

https://github.com/msys2/MINGW-packages/issues/6901

あたりが該当するissueにようにおもえる。

何回かpacman -Syuuで更新し続けているとそのうちmsys64直下にucrt64.exe/`ucrt64.icoが生えていく。

まだ駆け出しのプロジェクトでパッケージ側も対応していないものもある(私のパッケージもなんとかしないと・・・)。

トラブルシューティング

ucrt64.exe/`ucrt64.icoがない!

pacman -Syuuで更新し続けましょう。そのうち生えます。該当するパッケージは
https://packages.msys2.org/package/msys2-launcher?repo=msys&variant=x86_64
これです。

pacman -Syuuでucrt64を見に行っている様子がないが?

$pacman -Syuu
:: パッケージデータベースの同期中...
 mingw32 は最新です
 mingw64 は最新です
 ucrt64 は最新です
 msys は最新です

のようになっているのが望ましい状態だがucrt64がないぞという場合もある

/etc/pacman.confを確認する

[mingw32]
Include = /etc/pacman.d/mirrorlist.mingw32

[mingw64]
Include = /etc/pacman.d/mirrorlist.mingw64

[ucrt64]
Include = /etc/pacman.d/mirrorlist.ucrt64

[msys]
Include = /etc/pacman.d/mirrorlist.msys

上のようなのが含まれているのが望ましいが、ucrt64の項目がないかもしれない。その場合は手動で付け加える。

/etc/pacman.d/mirrorlist.ucrt64を確認する

そもそもないかもしれない。そういう場合は/etc/pacman.d/mirrorlist.minw64をコピーして作成して、各URLの末尾をucrt64に置換すればよい