2012-01-03 88 views
7

ビジュアルC++コンパイラでコンパイルされたコードがストレートC++の場合、なぜ再配布可能なパッケージが必要ですか?これはあなたのコードプラットフォームに依存しますか?ビジュアルC++コンパイラを再配布可能なパッケージで使用すると、g ++と一緒に別のIDEを使用するよりも利点がありますか?Visual C++再頒布可能パッケージが必要な理由

+2

コンパイルされたコードは、*必ず*プラットフォームに依存しています。コンパイルされたプラットフォーム上でのみ動作します。 –

+1

必須ではありません。代わりにセットアッププロジェクトを作成する必要があります。または、/ MDではなく/ MTでコンパイルして、まったく必要ないようにします。ただし、DLLを使用すると危険です。 –

答えて

6

コードはプラットフォームに依存しません。実行可能ファイルです。これは、DLLのような再配布可能ファイルに含まれている標準ライブラリの実装でMSライブラリとリンクされています。

IIRCすべての静的リンクオプションが必要です。追加の再配布可能ファイルは必要ありませんが、結果として生じるバイナリはプラットフォームに依存します。たとえば、UNIXでWindowsバイナリを実行することはできませんシステム(少なくともワインなし)。

+2

メモリマネージャ、標準I/Oライブラリ、および個別のアプリケーションのような個別のコピーを、1つのアプリケーションに含めて、管理したり膨大な量の膨大な量をアップグレードしたりすることはできません。それを必要とする可能性のあるアプリケーションごとにすべてのコードを1回だけ含んでいます。 –

+0

@DavidSchwartzええと...とにかく、Windowsのすべてのインストールでデフォルトで含まれていると思いますが、それは正しいのでしょうか? – littleadv

+1

これは、Windowsのインストールと実行時間によって異なります。たとえば、Windows Vista SP1の新規インストール(誰かがそれをまだインストールしている場合)には、VS2010ランタイムはありません。 –

5

"ストレートC++"のようなものはありません。あなたはあなたのコード内でここで呼び出されるいくつかのライブラリ関数が常に存在するでしょう。そして、あなたが非常に注意していても、コンパイラによって生成されたコードによって単に呼び出される必要があるいくつかの関数があります。コンパイラはコードに置き換えます

for(int i = 0; i < count; i++) 
    array1[i] = array2[i]; 

いる単にコピーするメモリオーバー:たとえば次のようなループを持っている場合。そして速度の代わりに小さなサイズのためにコンパイルしている場合、これはmemmove()と非常によく似た関数への呼び出しになります。

また、直接のx86対応の命令が存在しない浮動小数点演算もあります。これらは関数呼び出しでも実装されます。そして、そのリストは続く。

異なるプラットフォームでは、そのプラットフォームのコンパイラが、同じプラットフォームのC++ランタイムと同じコードをコンパイルするため、コードプラットフォームは依存しません。

幸いにも、C++ランタイムはアプリケーションとは別のエンティティである必要はありません。コンパイラとリンカのオプションを確認してください。両方を含む単一の実行可能ファイルを生成できるはずです。 g ++が別のランタイムを必要としていないことがわかった場合、これはデフォルトで正確に実行されるためです。

1

C++再配布は、使用しているIDEに固有のものです(「IDE」は、私が言うが、それは、コンパイラには本当に特定のですが、まだ物事が一緒に移動するようIDE &コンパイラは、両方の新しいバージョンを割り当てられている。)

これはそのIDE固有のものですが、Win OSのものではありません。したがって、それは下位互換性があるはずです(あなたが新しいAPIを使用していないと仮定すれば、明らかに)。最高のIDEバージョン(10,11,12 ...)で、Win2kでコードを実行してください!

もちろん、Linuxとは違い、各メインバージョンで再コンパイルすると予想されます。ほとんどのUnixシステムはそのように動作します。

これらの再配布可能ファイルを避けるために、C++を静的にコンパイルする方法はわかりません。可能であれば、あなたの.exeを非常に大きくするでしょうが。

0

私は常にVisual C++ 6のコピーをXP仮想マシンにインストールしています(Win 6/7/8では正しく動作しません)。時には私は、何かを高速で実行するためのユーティリティー・アプリケーションを書くことを頼まれているか、または一度オフにして、私が単一のexeとしてコンパイルすることを頼まれています。私はいくつかの不足しているdllまたは再配布可能なパックのために動作しないことを彼らに伝えるためにのみ、他の人に標準ライブラリのみを使って書かれた簡単なプログラムを送信するのが気にしない。

関連する問題