Visual Studio2012を使用してc++アプリケーションを構築しました。VS2012がインストールされていない別のマシンで実行しようとしましたが、実行されません。msvcr110d.dll(msvcr110.dllではない)を探し続け、アプリケーションをリリースモードでビルドし、ランタイムライブラリをマルチスレッドdll(/ MD)用に設定しました(ただし、すべてのオプションを試してみましたが、アベイルズ)。なぜこれが実行されないのかわかりません。ターゲットマシンには再配布可能ファイルがインストールされています。助言がありますか?
5 に答える
d.dll
接尾辞は、C++ランタイムDLLのデバッグバージョンを意味します。これは、exeがデバッグビルドであることを意味します。これには。が必要MSVCR110d.dll
です。
exeのリリースビルドをデプロイする必要があります。これには。が必要MSVCR110.dll
です。
ユーザーにVC2012ランタイム再頒布可能パッケージをインストールするように依頼しますMSVCR110.dll
。インストールされます。
作成しているソリューションがリリースモード構成を使用して構築されているだけでなく、すべての依存関係が非デバッグDLLも使用していることを確認してください。あなたが書いたように、あなたはインポートされたライブラリ(freeglut)を使用しているので、それらもチェックしてください。freeglutはオープンソースであるため、ビルド済みのDLLを使用する代わりに、(リリースモードを使用して)最初からビルドすることもできます。
問題は、freeglutがリリースライブラリではなくデバッグライブラリである可能性が高いため、デバッグモードDLLに対してリンクしようとしています。freeglutのリリースモードバージョンもおそらく存在し、代わりにそのfreeglutライブラリを使用するようにプロジェクト構成を変更する必要があります。
ただし、ここにはさらに深い問題があります。これを確実に確認するにはどうすればよいですか。問題の原因となっている別のライブラリがある場合、またはそれが自分の実行可能ファイルにあいまいな設定である場合はどうなりますか?DependencyWalkerツールが非常に役立つことがわかりました。そのページには、Visual C ++に含まれていると記載されていますが、Visual C ++のどのインストールでも見つかりませんでした(おそらく、すべてのオプションコンポーネントをインストールしなかったためです)。含まれているヘルプファイルも機能しませんでしたが、Webページでヘルプファイルの内容を表示できます。
freeglut.dllの依存関係のビュー。このバージョンのFreeGLUTで使用されている特定のCランタイムを強調しました。おそらくあなたのランタイムは異なります。右側の関数のリストは、MSVCRTがエクスポートするものを示しており、強調表示されているものは、使用されているように見えるものです。たとえば、このバージョンのFreeGLUTは演算子newを使用しているように見えます。名前が壊れている場合は、F10キーを押して、C ++名の装飾を解除し、関数が何であるかを確認します。欠落しているDLLはすべて「遅延ロード」DLLであるように見えるため(砂時計を参照)、おそらく問題ではありません。
私はDependencyWalkerを使用して、いくつかの厄介なDLLの問題を把握しました。特定の問題に対してはやり過ぎかもしれませんが、問題があると推測するのではなく、実際に問題を確認できるツールを知っておくと便利だと思います。
すばやく簡単な方法は、msvcr110d.dllを開発マシンからターゲットマシンにコピーすることです。アプリが構築されているアーキテクチャ(Windows\System32またはWindows\SysWOW64)に対応するディレクトリからのものを使用していることを確認してください。
リリースEXEまたはDLLをビルドし、Visual Studio 2012がないマシンでそれらを使用しようとしている場合でも、 VisualStudio2012用のVisualC++再頒布可能パッケージをインストールする必要があります。