VS2015からVS2017にいくつかのプログラムを移植した後、バイナリがWindows 7またはWindows XP- have v141_xp
ツールセットでコンパイルされました。プログラムは、DLL api-ms-win-core-rtlsupport-l1-2-0.dll
(2に注意)がないため、起動に失敗します。
これらのapi-ms-win-*
DLLはUCRTに属し、VS2015以降、Windows 10 SDKからUCRT DLLを再配布する必要があることをよく知っています(Windows 10のRedist\ucrt\DLLs
にあります) SDKディレクトリ)、および私のアプリケーション-vcruntime140.dll
およびmsvcp140.dll
を再配布するだけで十分ですnotで十分です。しかし、私のWindows SDKディレクトリにはapi-ms-win-core-rtlsupport-l1-1-0.dll
しかありませんが、notapi-ms-win-core-rtlsupport-l1-2-0.dll
です。念のため、最新のWindows SDK(10.0.15063)をダウンロードして再インストールしました。それでもDLLはありません!
また、VS2017再頒布可能パッケージをVC_redist.x86.exe
経由でWindows 7(またはXP)マシンにインストールしようとしました-Visual Studio Webサイトからダウンロードした最新バージョン(14.11.25325)。明らかに、これはapi-ms-win-*
DLLを "System32"ディレクトリにコピーします。ただし、繰り返しになりますが、api-ms-win-core-rtlsupport-l1-1-0.dll
のみnotapi-ms-win-core-rtlsupport-l1-2-0.dll
です。アプリはまだ起動しません:-/
何か案は?
よろしくお願いします、
MuldeR
[編集]
もちろん、これは、DLLランタイム(/MD
)に対してリンクした場合にのみ適用されます。「静的」ランタイム(/MT
)に対してリンクした場合、 no DLL UCRTへの依存関係があり、Windows 7およびXPで正常に動作します。
[編集#2]
混乱の解決策については、他の投稿(EDITを含む)を参照してください。
https://stackoverflow.com/a/45773325/1766377
さて、これは非常に興味深いです:今すぐ私のVS2017は新しい更新を見つけました。どうやらそれは私のVS2017をv15.2からv15.3.1に更新しました。ランタイムライブラリも更新されたようです。
twoディレクトリ、VC\Redist\MSVC\14.11.25325
andVC\Redist\MSVC\14.11.25415
がVS2017インストールディレクトリ内にあります。 vcruntime140.dll
は両方のディレクトリに存在します。しかしnewerバージョン(25415、右)は、古いバージョン(25325、左)と比べてかなり異なる依存関係を持っています。
「新しい」バージョンのみに依存関係があり、Windows 7にはありません。したがって、「古い」バージョンで問題なく進む必要があります。しかし、それは私が「古い」バージョンにロックされていることを意味します。これは正常ですか?
(BTW:両方DLL VS2017からのバージョンv15.3.1は新しいのバージョンよりも私はもともとv15.2)から取得しました
よろしく、
MuldeR
[編集]
つまり、VC\Redist\MSVC\14.11.25325
andの間に微妙なの違いがあることに私の注意が向けられました= VC\Redist\MSVC\14.11.25415
ディレクトリ:25415ディレクトリには、すべてのDLLファイルがonecore
という別のサブフォルダー内にありますが、もう1つはありません。明らかに、これは "新しい" = DLLバージョン(onecore
サブフォルダがあるバージョン)はnot通常のデスクトップアプリケーションで再配布されることが想定されており、これらは厳密には「OneCore」モバイル/ IoTプラットフォーム用です。
結論:
M $はRedistディレクトリ構造できるだけ混乱するを設計するために素晴らしい仕事をしました。 「通常」と「onecore」の再配布可能ファイルのバージョン番号をディレクトリ階層の同じレベルに配置する(onecore
とdesktop
ディレクトリを別々に持つのではなくthatlevel)は、それらのディレクトリが同じものの異なるバージョンを表すことを示します-これはまったく当てはまりません:-/
*/onecore/*
DLLを再配布しないでください。プロジェクトのプロパティページで、Windows SDKのバージョンを10.0.15063.0から10.0.10240.0に変更してみてください。古いSDKがビルドマシンにインストールされていれば、問題は解決すると思います。他に試すことは、プラットフォームツールセットをv140_xpに変更することです。 VS 2017は、VS 2015がインストールされている場合、VS 2015ツールチェーンでビルドされます。
私の個人的な好みは、静的ランタイムとリンクすることで「DLL hell」を回避することですが、exeとdllがヒープを共有する必要がある場合は機能せず、複数のバイナリをビルドしている場合はスペースのペナルティが発生します(二)。