以前の記事、UCRTをアプリと同じフォルダに置く (VS2015 RTM)の更新版です。Visual Studio 2015 Update 1以降の変更を反映させました。
おさらい
Visual C++ 2015でCRTの構成が大きく変わりました。C標準ライブラリ関数の多くがucrtbase.dll(リリースビルド), ucrtbased.dll(デバッグビルド)に移され、Windows SDKの配下になりました。これがユニバーサルCRT (Universal CRT; UCRT)です。
ucrtbase.dllはOSの一部という扱いになりました。Windows 10では最初から入っています。Vista~8.1に対してもWindows Updateで配信されており、最新はKB311841です: Windows での汎用の C ランタイムの更新プログラム。なお、VS 2015 RTM時点ではKB2999226でした。
あまり変わらない場合
以下の場合、Visual C++ 2013までとほぼ変わりありません。
- 再頒布パッケージvcredist_x86.exe, vcredist_x64.exeを使う場合: UCRTも同時にインストールされます。
- コンパイラオプション
/MT
や/MTd
で静的リンクする場合: UCRT部分も静的にリンクされます。
なお、日本語版の再頒布パッケージは、マイクロソフトのダウンロードセンターからダウンロードできます: Download Visual Studio 2015 の Visual C++ 再頒布可能パッケージ from Official Microsoft Download Center。
ちょっと変わる場合
問題は、VC++ランタイムDLLを同梱し、アプリと同じフォルダにランタイムDLLを置く場合です。
- ユニバーサルCRT(KB311841やKB2999226)がインストール済みであることをあてにしてよければ、概ね今までどおりです。すなわち、VC++ 2015でビルドしたアプリと同じフォルダにVC++ランタイムDLLを置くだけで良いです。
- それをあてにできない場合、VC++ 2015のランタイムDLLに加え、ユニバーサルCRT(ucrtbase.dllとそれが依存するファイル)も同じフォルダに置くことになります。
ようするにランタイムDLLのファイルがたくさん増えたというだけで、難しいことではないです。
なお、マージモジュールを使う場合も同じく影響があるはずです。なぜなら、VC++ 2015のマージモジュールには、UCRTが含まれていないとのことだからです。しかし、私がマージモジュールを使ったことがないので、お話しできません。
DLLの場所
というわけで、VC++ 2015とUCRTのランタイムDLLをアプリに同梱するにあたり、必要なDLLファイルの場所を紹介していきます。なお、この先現れるC:\Program Files (x86)
は、ご自身の環境に応じて適当に読み替えてください。
リリースビルドの場合、
- Visual C++ 2015ランタイム(リリースビルド用)
- ユニバーサルCRT(リリースビルド用)
で紹介するファイルが必要です。デバッグビルドの場合
- Visual C++ 2015ランタイム(デバッグビルド用)
- ユニバーサルCRT(デバッグビルド用)
で紹介するファイルが必要です。
いつもどおりであれば、デバッグビルド用のランタイムライブラリは再頒布可能ではないはずです。すなわち、自分でデバッグするためなどの用途でしか使えないと思います。注意してください。
Visual C++ 2015ランタイム(リリースビルド用)
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\redist
の中にファイルがあります。VC++ 2013までと同じなので、以前のバージョンを使ったことがあるかたなら、すぐ分かるでしょう。
このフォルダの中のx86
ならびにx64
フォルダの中、以下のファイルが必要になります。
- Microsoft.VC140.CRT\vcruntime140.dll: ほぼすべての場合
- Microsoft.VC140.CRT\msvcp140.dll: C++標準ライブラリを使用している場合
- Microsoft.VC140.CRT\vccorlib140.dll: C++/CXプログラムの場合
- Microsoft.VC140.CRT\concrt140.dll: 同時実行ランタイム (ConcRT)を使用している場合
- Microsoft.VC140.CXXAMP\vcamp140.dll: AMPを使用している場合
- Microsoft.VC140.OPENMP\vcomp140.dll: OpenMPを使用している場合
Visual C++ 2015ランタイム(デバッグビルド用)
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\redist\debug_nonredist
にリリースビルド用の場合と同じような階層構造でファイルが置いてあります。
x86
ならびにx64
の中に、以下のようなファイルがあります。
- Microsoft.VC140.DebugCRT\vcruntime140d.dll
- Microsoft.VC140.DebugCRT\msvcp140d.dll
- Microsoft.VC140.DebugCRT\vccorlib140d.dll
- Microsoft.VC140.DebugCRT\concrt140d.dll
- Microsoft.VC140.DebugCXXAMP\vcamp140d.dll
- Microsoft.VC140.DebugOpenMP\vcomp140d.dll
ユニバーサルCRT(リリースビルド用)
x86, x64それぞれ、以下の場所にあるファイルすべてです。ucrtbase.dllとそれに必要なDLLがすべて置いてあります。
- C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\x64
- C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\x86
念のため、前回同様にファイルの一覧も載せておきます。
- api-ms-win-core-console-l1-1-0.dll
- api-ms-win-core-datetime-l1-1-0.dll
- api-ms-win-core-debug-l1-1-0.dll
- api-ms-win-core-errorhandling-l1-1-0.dll
- api-ms-win-core-file-l1-1-0.dll
- api-ms-win-core-file-l1-2-0.dll
- api-ms-win-core-file-l2-1-0.dll
- api-ms-win-core-handle-l1-1-0.dll
- api-ms-win-core-heap-l1-1-0.dll
- api-ms-win-core-interlocked-l1-1-0.dll
- api-ms-win-core-libraryloader-l1-1-0.dll
- api-ms-win-core-localization-l1-2-0.dll
- api-ms-win-core-memory-l1-1-0.dll
- api-ms-win-core-namedpipe-l1-1-0.dll
- api-ms-win-core-processenvironment-l1-1-0.dll
- api-ms-win-core-processthreads-l1-1-0.dll
- api-ms-win-core-processthreads-l1-1-1.dll
- api-ms-win-core-profile-l1-1-0.dll
- api-ms-win-core-rtlsupport-l1-1-0.dll
- api-ms-win-core-string-l1-1-0.dll
- api-ms-win-core-synch-l1-1-0.dll
- api-ms-win-core-synch-l1-2-0.dll
- api-ms-win-core-sysinfo-l1-1-0.dll
- api-ms-win-core-timezone-l1-1-0.dll
- api-ms-win-core-util-l1-1-0.dll
- api-ms-win-crt-conio-l1-1-0.dll
- api-ms-win-crt-convert-l1-1-0.dll
- api-ms-win-crt-environment-l1-1-0.dll
- api-ms-win-crt-filesystem-l1-1-0.dll
- api-ms-win-crt-heap-l1-1-0.dll
- api-ms-win-crt-locale-l1-1-0.dll
- api-ms-win-crt-math-l1-1-0.dll
- api-ms-win-crt-multibyte-l1-1-0.dll
- api-ms-win-crt-private-l1-1-0.dll
- api-ms-win-crt-process-l1-1-0.dll
- api-ms-win-crt-runtime-l1-1-0.dll
- api-ms-win-crt-stdio-l1-1-0.dll
- api-ms-win-crt-string-l1-1-0.dll
- api-ms-win-crt-time-l1-1-0.dll
- api-ms-win-crt-utility-l1-1-0.dll
- ucrtbase.dll
さてはて、ucrtbase.dllとVC++ランタイムの依存関係を見ても、ここにあるファイルすべてが必要なわけではなさそうに見えます。Windows XPに持っていって動かしてみましたが、やはりそうです。少し気になります。
ユニバーサルCRT(デバッグビルド用)
上記ユニバーサルCRT(リリースビルド用)で紹介した場所にあるファイルのうち、ucrbase.dll
以外と、以下の場所にあるucrtbased.dll
が必要となります。
C:\Program Files (x86)\Windows Kits\10\bin\x86\ucrt
C:\Program Files (x86)\Windows Kits\10\bin\x64\ucrt
むすび
Visual Studio 2015 RTMでは、パッケージングでミスしてC:\Program Files (x86)\Windows Kits
配下のファイルが使えないという話でしたが、Update 1で直ったようです: Introducing the Universal CRT | Visual C++ Team Blogの“Distributing Software that uses the Universal CRT”の6.。そのため、今回の記事を書きました。
上記では、x86とx64のみを紹介しましたが、ほとんどにはarmも、一部にはarm64もあります。ただ、デスクトップアプリを作れるわけではないので、今のところ出番は無いと思います。
2016年4月26日追記: UCRTの更新KB311841とVC++ 2015 Update 2の再頒布パッケージの記載を追加しました。Nさん(コメント)より情報提供いただきました。ありがとうございます。
2016年7月16日追記: VC++ Update 3の再配布パッケージの記載に差し替えました。Update 1とUpdate 2の再配布パッケージは、ダウンロードセンターから削除されたようです。
スポンサード リンク |
この記事のカテゴリ
- VC++ ⇒ UCRTをアプリと同じフォルダに置く (VS2015 Update 1以降)
再配布パッケージのUpdate2が出ていました。
https://www.microsoft.com/en-us/download/details.aspx?id=51682
UniversalCRTもKB3118401として新しいのが出てますが、再配布パッケージに含まれているのがKB2999226なのでどちらでもいいのかもしれません。
https://support.microsoft.com/en-us/kb/3118401
https://www.microsoft.com/en-US/download/details.aspx?id=50410
ちなみに現在WindowsUpdateで落ちてくるのはKB3118401のほうになっているようです。
ありがとうございます。この記事を公開したあとにKB3118401は見つけていたのですが、Microsoft Visual C++ 2015 Redistributable Update 2は見落としていました。記事本文に反映いたします。