1

VS2010とC++を使用してから長い時間が経ちましたが、使用を再開すると、昨年私を悩ませたのと同じ問題が発生します。コンパイルしたexeファイルがうまく実行されないということです。正しいC++ランタイムを持たない古いマシン。どのリンクを指定すればよいかわからないので、 「MSVCR100.dllがコンピュータにないため、プログラムを起動できません。プログラムを再インストールしてこの問題を解決してください」というエラーが発生した後、これをインストールするように指示しました。 。[OK]をクリックしてアプリケーションを閉じます。")。そこで、コード生成を/ MTに設定し、かなりの数のオプションを無効にして、たくさんのオプションをいじってみましたが、それでも同じ結果になりました。

私の質問は次のとおりです。VS2010でコンパイルしたすべてのC++プログラムがWindowsXPで動作するように、またはさらに良い方法で一般的な方法で動作するように、提供してインストールするように指示できる完全なVS 2010C++配布可能ファイルのリストはありますか。動作するために必要なものがすべて含まれ、DLLに依存しないスタンドアロンのexeファイルですか?exeが参照するすべてのものを含むライブラリにリンクすることを考えています。それが役に立ったら、私はx64とx86の両方のために構築しています。

PSマニフェストファイルはどうなっていますか?含める必要がありますか?

4

5 に答える 5

6

最も簡単な方法は、VC++再頒布可能パッケージをインストールすることです。x86バージョンとx64バージョンの両方があります。

于 2011-02-14T23:35:05.187 に答える
4

まず、実際に詳細を説明する前に、次のようにします。


警告

これを行うと、次の2つの理由で状況が悪化します。

  1. MSVCランタイムにセキュリティやその他のバグがあり、このアプローチを採用している場合、それらはアプリに組み込まれているため、再配布する必要があります。理論的にはシステムアップデートを使用するため、DLLが推奨されます。これは、エラーが修正されることを意味します。
  2. あなたがあなたのexeにコンパイルする他のすべてもこれをする必要があります。そうしないと、2つのバージョンのコードが作成され、使用しているものはすべてリンクされません。

考えられる解決策の1つは、静的にリンクされたC / C ++ランタイムのマルチスレッドバージョンを意味するcl.exeオプション(C / C ++コンパイラ設定)を使用して、MSVCランタイムをアプリケーションに組み込むことです。/MT私が言ったように、ランタイムに動的にリンクされているものに対してリンクしようとすると、混乱してしまいます。また、私が言ったように、これは追加のセキュリティリスク要因を表すので、それを覚えておいてください。

他のオプションは、適切なランタイムをダウンロードするか、必要なDLLを含めることができるインストーラーを作成することです。

特定のバージョンのWindowsを超えるランタイムの機能を使用している場合(一般的なステートメントですが、実際に発生します)、Windows SDKを使用して、適切なCランタイムを使用してさまざまなバージョンのWindowsをターゲットにできるはずです。

于 2011-02-14T23:34:51.283 に答える
3

http://www.microsoft.com/downloads/en/details.aspx?FamilyID=a7b7a05e-6de6-4d3a-a423-37bf0912db84

グーグルテキスト:ビジュアルスタジオC ++ redist

ランタイムに静的にリンクしないでください。特に、他の目的で何らかのdllを使用している場合は、そうしないでください。それはあなたがおそらく台無しにしたくないヒープ管理に関するあらゆる種類の偽の問題を紹介します。

于 2011-02-14T23:37:15.343 に答える
1

プロジェクトのプロパティダイアログを開き、[構成プロパティ]、[構成プロパティ]の順に選択します。C / C ++ | コード生成。デフォルト設定はマルチスレッドDLLです。これをマルチスレッドに変更すると、ランタイムが静的にリンクされた.EXEがビルドされます。デバッグバージョンでも同じことを行うことを忘れないでください。

MFCまたはATLを使用している場合は、[構成のプロパティ]|[構成のプロパティ]に移動する必要があります。一般的に、「MFCの使用」または「ATLの使用」を設定して静的にリンクします。

注意:ランタイムを静的にリンクする場合は、リンクしている他のライブラリも静的にリンクしていることを確認する必要があります。そうしないと、メモリ内にランタイムの2つのコピーが作成され、それぞれに独自のヒープがあり、一方のランタイムを使用するコードがもう一方のランタイムによって割り当てられたオブジェクトを解放しようとすると、問題が発生します。

于 2011-02-14T23:36:32.423 に答える
0

この前の答えはVS2010にも当てはまるはずです。私はまだVS2005でビルドしていますが、古いマシンと新しいマシンで同じように実行できるという唯一の理由で、すべてのアプリが静的CRTを使用しています。

于 2011-02-14T23:31:11.890 に答える