ビジュアル C++/スタジオ:アプリケーションの設定が間違っていますか?
-
01-07-2019 - |
質問
Visual C(++)/Visual Studio を使用して記述およびコンパイルされた C(++) プログラムは、自分のマシンでは正常に動作しますが、別のマシンでは実行できません。表示されるエラー メッセージは、「アプリケーションの構成が正しくないため、このアプリケーションを開始できませんでした。アプリケーションを再インストールすると、この問題が解決する可能性があります。」
解決
C++ プログラムを作成すると、C ランタイム ライブラリ (略して CRT) に動的にリンクされます。このライブラリには、printf、malloc、strtok などが含まれています。このライブラリは、MSVCR80.DLL というファイルに含まれています。このファイルはデフォルトでは Windows システムにインストールされないため、アプリケーションは実行できません。
ソリューション?VCREDIST.EXE (Visual C++ 再頒布可能パッケージ) を介してターゲット マシンに DLL をインストールするか、CRT に静的にリンクします (使用する関数の実際のコードを EXE に直接プラグインします)。
単純なアプリケーションと一緒に VCREDIST を配布してインストールするのは大変な作業なので、2 番目のオプションを選択しました。静的リンク。とても簡単です:プロジェクトのプロパティに移動し、C/C++ を展開し、[コード生成] をクリックして、ランタイム ライブラリを非 DLL オプションの 1 つに設定します。それだけです。
他のヒント
ここでの問題は、CRT (C ランタイム ライブラリ) などの DLL 依存関係が欠落していることです。この種の問題を診断するための優れたツールは、Dependency Walker (depends.exe) です。これは次の場所にあります。
http://www.dependencywalker.com/
投稿したエラー メッセージを生成するコンピューター上でこのプログラムを実行し、それを使用してこのエラーを生成する exe を開きます。dependency Walker は、必要だがマシン上で利用できない DLL を迅速かつグラフィカルに表示します。
Visual Studio のランタイム ライブラリ (特に CRT) を見逃している可能性が高いため、それらの依存関係を削除する (静的リンク) か、ターゲット コンピューターに VC redist パッケージをインストールすることができます。
使用する Visual C++ のバージョンに応じて、異なるパッケージをインストールする必要があります。
警告 :これらのパッケージにはライブラリのリリース バージョンのみが含まれているため、アプリケーションのデバッグ ビルドを配布できるようにしたい場合は、必要な DLL を自分で用意する必要があります。
ランタイムに静的にリンクするのが最も簡単です。
C++ -> コード生成 -> ランタイム ライブラリで「マルチスレッド /MT」を選択します。
ただし、これにより実行可能ファイルは数百 KB 大きくなります。多数の小さなプログラムをインストールする場合、それぞれのプログラムにランタイムの独自のコピーによる負荷がかかるため、これが問題になる可能性があります。答えは、インストーラーを作成することです。
新しいプロジェクト -> 「セットアップと展開」 -> 「プロジェクトのセットアップ」
アプリケーション プロジェクト (ランタイムの DLL バージョンを使用して定義) からの出力をインストーラー プロジェクトにロードし、ビルドします。ランタイム DLL への依存関係が認識され、インストーラー パッケージに組み込まれ、ターゲット マシン上の適切な場所にきちんと目立たないようにインストールされます。
あなたにとって適切な VC Redist パッケージは、Visual Studio インストールの一部です。VC 8 の場合は、次の場所にあります。
\Program Files\Microsoft Visual Studio 8\SDK\v2.0\BootStrapper\Packages\vcredist_x86
考えられる解決策....
編集:(私の投稿のほとんどを削除しました)長い話を短くして、私は同様の問題を抱えており、「アプリケーション構成の不正な」メッセージなどを取得していました。depends.exe は、考えられる問題として ieshims.dll と wer.dll のみを検出していましたが、これは問題ではありません。結局、マルチスレッド (/mt) コンパイル オプションを使用することになりました。ただし、実行可能な解決策として機能したのは、InstallShield を使用してインストーラーを作成することです。installshield ビルダーでいくつかのマージ モジュールを選択しましたが、これで問題が解決されたようです。選択されたモジュールは次のとおりです。VC++ 9.0 CRT、VC++ 9.0 DEBUG CRT、および CRT WinSXS MSM マージ モジュール。WinSXS マージ モジュールがそれを修正したと確信しています。
デバッグ CRT:どこかで (どんなに頑張っても、これまで明らかに失敗していましたが)、私のリリース バージョンは依然として DEBUG CRT に依存していることに気づきました。これがまだ当てはまる場合は、InstallShield マージ モジュールによって DEBUG CRT フォルダーが私の WinSXS フォルダーに配置されています :) VC++ については多少の初心者なので、これは通常、プログラムのデバッグ バージョンを他の人に配布するために使用されると思います。これで問題が解決したかどうかをテストするために、WinSXS フォルダーから DEBUG CRT フォルダーを削除しましたが、アプリケーションは引き続き動作しました。(バックグラウンドで何かがまだ実行されていない限り、など - 私はそれには興味がありません)
とにかく、これにより、完全にアップデートされた XP SP3 マシンでも、必要最低限の機能 (基本的に .net 3.5 と VC++ 2008 RTM) を備えた VMWare XP SP3 マシンでも、また以前は動作していた友人の XP マシンでも動作するようになりました。機能していませんでした。
したがって、これらのことを試してみてください。幸運が訪れるかもしれません。
まず最初に使わなければいけないのは
#define _BIND_TO_CURRENT_VCLIBS_VERSION 1
または追加します _BIND_TO_CURRENT_VCLIBS_VERSION=1
プリプロセッサディレクティブに。
この問題はバインディングとマニフェスト タイプに関連しています。詳細については、こちらをご覧ください。 http://www.nuonsoft.com/blog/2008/10/29/binding-to-the-most-recent-visual-studio-libraries/
これを行うと、アプリケーションはより幅広いバージョンのランタイム ライブラリで実行できるようになります。
多くの場合、このエラーは、.NET を使用するアプリケーションのデバッグ バージョンを実行しようとした結果として発生します。.NET 再頒布可能パッケージには、Visual Studio とともにインストールされる DLL のデバッグ バージョンが含まれていないため、Visual Studio がインストールされていない他のマシンでアプリケーションを実行すると、このエラーが発生することがよくあります。まだ作成していない場合は、アプリケーションのリリース バージョンをビルドしてみて、それが機能するかどうかを確認してください。
また、静的ランタイムに変更する場合、アプリが MFC を使用している場合は、MFC に対しても同じことを行う必要があることにも注意してください。これらの設定はプロパティ -> 構成/全般にあります。
この問題に遭遇しましたが、非常に簡単に解決できました。
Visual Studio には、ビルドごとにマニフェストをビルドするオプション (デフォルトでオン) が用意されています。
マニフェストはリリース フォルダーに配置されましたが、exe とは異なるリリース フォルダーでした。
セットアップユーティリティを使用する場合でも、パッケージ化されていませんでした。
myprogram.exe.indermediate.manifest のようなファイル名を探す必要があります。
これが exe と同じフォルダーにある場合 (すべての DLL がある場合)、実行されるはずです。