ビジュアル C++/スタジオ:アプリケーションの設定が間違っていますか?

StackOverflow https://stackoverflow.com/questions/99479

質問

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++ のバージョンに応じて、異なるパッケージをインストールする必要があります。

ビジュアルC++2005

Visual C++ 2005 SP1

ビジュアルC++2008

警告 :これらのパッケージにはライブラリのリリース バージョンのみが含まれているため、アプリケーションのデバッグ ビルドを配布できるようにしたい場合は、必要な 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 がある場合)、実行されるはずです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top