vcruntime140.dllなどのファイルがないエラー対策で「再頒布可能ファイル」を使おうと思ったときに調べたこと

もくじ
https://tera1707.com/entry/2022/02/06/144447

やりたいこと

C++で作ったアプリを、まっさらなクリーンインストールしたWindowsで動かしたときに、

  • vcruntime140.dllがない
  • msvcp140.dllがない

というエラーが起きて、アプリがクラッシュした。

で、その対策として、MSの下記のようなページから、

  • vc_redist.x64.exe
  • vc_redist.x86.exe

をダウンロードして、対象のPCにインストールすると、動くようになる、というのは知っていた。

ダウンロード先

www.microsoft.com

ただ今回、いろんな事情で、それらをインストールしてやることができなかった。

代わりに、vc_redist.x64.exevc_redist.x86.exeをインストールしたときに入るvcruntime140.dllのようなファイルを、必要な分(dll)だけ手でコピーして、対象PCの、自分のアプリのexeと同じ階層に配置してやろうと思った。

が、手でコピーするにも、

  • どこにあるファイルをコピーするのが正しいのか?
  • そもそもそういうことをしてもいいのか?

がわからなかった。

それっぽいドキュメントが下記にあったので、そこを頑張って熟読し、どういうことができるか調べたい。

結論

今回の結論として、

  • vcruntime140.dllなどのisonファイルを手でコピーしてアプリのexeと同じ階層において使うのはアリ
    • ただし、Microsoft的に推奨はしない。
    • その場合、WindowsUpdateでそれらの依存ファイルが更新されないので、脆弱性を抱える可能性がある
  • 推奨は、vc_redist.x64.exevc_redist.x86.exeで「Central Deploy」すること
    • その場合、WindowsUpdateで依存ファイルを更新することができる
  • 手でコピーする際のコピー元としては、開発者コマンドプロンプト%VCINSTALLDIR%Redist\MSVC\と打つとでるフォルダがよい
    • 私の自宅PCだと、VS2022 Communityなので下記だった(x64アプリの場合)
      • C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Redist\MSVC\14.44.35112\x64
  • %VCToolsRedistDir%がよいかも
    • 私の自宅PCだとこうだった(最終的に、👆と同じフォルダ近辺を指すのだが)
      • C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Redist\MSVC\14.44.35112\
  • それらのフォルダにある、一番新しいVSバージョン、MSVCバージョンのdllファイルで、プラットフォーム等が一致するものを使うのがよい

調べたことメモ

VCの再頒布可能パッケージは、👇のようなMSのダウンロードページからダウンロードできるが、

https://www.microsoft.com/ja-jp/download/details.aspx?id=48145

VisualStudio 2022、2019などをインストールすると、そのバージョンにあった「再頒布可能パッケージ」のインストーラーと、そこに含まれるdllなどのファイルが一緒にPCにインストールされている。

ここでいう「再頒布可能パッケージ」というのは、vc_redist.x64.exevc_redist.x86.exeの、再頒布可能ファイルをすべて一括でインストールしてくれるもの。

ここでいう「そこに含まれるdllなどのファイル」というのは、vcruntime140.dllmsvcp140.dllなどのファイル。

VisualStudioと一緒にインストールされる再頒布可能パッケージは、そのVSに対応する「開発者コマンドプロンプト」で、

explorer %VCINSTALLDIR%Redist\MSVC\

を実行すると開くフォルダに置かれている。

自宅PCだとこうだった。

もしくは、

explorer %VCToolsRedistDir%

の方がよいかも。

自宅PCだとこうだった。

この辺に書かれてる。


https://learn.microsoft.com/en-us/cpp/windows/redistributing-visual-cpp-files?view=msvc-170#locate-the-redistributable-files

そこに置かれてるフォルダの命名ルールはこのあたり。

https://learn.microsoft.com/en-us/cpp/windows/determining-which-dlls-to-redistribute?view=msvc-170

再頒布ファイル一覧のほうに、具体的にどのファイルが再頒布可能なのか、の説明があった。


https://learn.microsoft.com/ja-jp/visualstudio/releases/2022/redistribution#visual-c-runtime-files

ただし、デバッグビルド用のファイルは再頒布できないとのこと


https://learn.microsoft.com/en-us/cpp/windows/determining-which-dlls-to-redistribute?view=msvc-170

今回、足りなくてアプリが起動しなかったファイルはvcruntime140.dllだったので、下記にあった。

%VCINSTALLDIR%Redist\MSVC\14.44.35112\x64\Microsoft.VC143.CRT
もしくは
%VCToolsRedistDir%x64\Microsoft.VC143.CRT
実際のパスは
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Redist\MSVC\14.44.35112\x64\Microsoft.VC143.CRT

こんな感じ


再頒布可能パッケージは、👇からダウンロードできる。

https://learn.microsoft.com/ja-jp/cpp/windows/latest-supported-vc-redist?view=msvc-170

→👆のページからの飛び先

https://learn.microsoft.com/ja-jp/cpp/windows/latest-supported-vc-redist?view=msvc-170#latest-supported-redistributable-version

2015以降は同じものを使うことになるが、ダウンロードしたvc_redist.x64.exevc_redist.x86.exeには、その時の最新のdllが含まれる。


https://learn.microsoft.com/ja-jp/cpp/windows/latest-supported-vc-redist?view=msvc-170#visual-studio-2015-2022

再頒布するときの再頒布可能パッケージ/ファイルは、
開発に使用したVisualStudioのバージョンと同じかより新しいものを使う。

例えばVS2019を使ってビルドされたアプリで 2017 の再頒布可能ファイルを使用することはできない。


https://learn.microsoft.com/en-us/cpp/windows/determining-which-dlls-to-redistribute?view=msvc-170

vc_redist.x64.exevc_redist.x86.exeでCentral Deployせず、dllを個別に、自分のアプリに含めることもOK。


https://learn.microsoft.com/en-us/cpp/windows/redistributing-visual-cpp-files?view=msvc-170#install-individual-redistributable-files

ただし、👇のようなことが起きるかもよ。とのこと。


https://learn.microsoft.com/en-us/cpp/windows/redistributing-visual-cpp-files?view=msvc-170#potential-run-time-errors

個別のファイルの説明があった。
なるほど、今回のvcruntime140.dllは、「通常の C および C++ 言語の起動および終了サービスを使用するアプリケーション」で必要になるらしい。


https://learn.microsoft.com/en-us/cpp/windows/determining-which-dlls-to-redistribute?view=msvc-170

、、、という調べた内容をまとめると、上の結果になった。

調べたこと その2

今回の問題にはあまり関係ないのだが、CentralDeploy以外に、「マージモジュール」というのを使って再頒布可能ファイルを対象PCにインストールできるっぽい。

https://learn.microsoft.com/en-us/cpp/windows/redistributing-visual-cpp-files?view=msvc-170#install-the-redistributable-merge-modules

ただしこれもMS非推奨とのこと。

あまり詳しく調べてないが、vc_redist.x64.exevc_redist.x86.exeのCentral Deployだと、再頒布可能ファイルが「全部」一気にインストールされ、それらはWindowsUpdateの仕組みでUpdateできるが、マージモジュール方式だと、機能単位?で再頒布可能ファイル群をインストールできる、ただしWindowsUpdateでUpdateはできないらしい。

機能単位は、おそらく👇のフォルダの単位っぽい。

VisualStudioインストーラーの「C++ 2022 再頒布可能パッケージMSM」をインストールすると、使えるようになるらしい。


https://learn.microsoft.com/en-us/cpp/windows/redistributing-components-by-using-merge-modules?view=msvc-170#where-to-find-merge-module-files

※ただ、使わなさそうなのでこれは今は調べないでおく。使うときに調べる。

参考

Visual C++ ファイルの再配布
「再頒布可能DLLをアプリケーションローカルフォルダに直接インストールすることも可能」と書かれてる

https://learn.microsoft.com/en-us/cpp/windows/redistributing-visual-cpp-files?view=msvc-170

再配布する DLL の決定
なにを再頒布してよいのか?の一覧

https://learn.microsoft.com/ja-jp/cpp/windows/determining-which-dlls-to-redistribute?view=msvc-170https://learn.microsoft.com/en-us/cpp/windows/determining-which-dlls-to-redistribute?view=msvc-170

Visual C++での展開
展開の種類の説明(Central Deploy、Local、StaticLinkなど。。。)

https://learn.microsoft.com/en-us/cpp/windows/deployment-in-visual-cpp?view=msvc-170

再頒布可能コード(vs2022)
※同様のページが、各VisualStudioにある。(2019、2017、2015・・)

https://learn.microsoft.com/ja-jp/visualstudio/releases/2022/redistribution#-distributable-code-files-for-visual-studio-2022