Visual Studio C ランタイムに静的にリンクするか動的にリンクする必要がありますか?
質問
Visual Studio プロジェクトで C ランタイム ライブラリに静的にリンクすべきか動的にリンクすべきかについて、両側の議論を読みましたが、どう考えるべきかまだ完全にはわかりません。
私のプロジェクトはいくつかのサードパーティ ライブラリ (Python、HDF5、Trilinos、Microsoft MPI) を取り込んでおり、それぞれのライブラリは最終的な実行可能ファイルと同じランタイム ライブラリを使用してビルドする必要があります (そうしないと、相互にリンクできません)。静的にリンクする場合、これらの各ライブラリには C ランタイムのコピーが含まれます。最終的な実行可能ファイルにはランタイムの複数のコピーが含まれており、それらのコピーは相互作用できないため、これによって問題が発生する可能性があると読みました。しかし、同じシンボルが複数定義されている場合、リンカは文句を言わないでしょうか?
「DLL 地獄」は避けたいのですが、ランタイムの複数のコピーで静的にリンクすることで発生する可能性のある潜在的なエラーが心配です。私の読み方が間違っているのでしょうか?
また、Visual Studio 2005 を使用していますが、Service Pack 1 ランタイムには下位互換性がないと読みました。これは、SP1 なしでビルドされたアプリは、たとえ同じ名前であっても、SP1 DLL がインストールされたマシンでは実行できないことを意味しますか (例:msvcr80.dll)?
解決
静的にリンクすると、すべての EXE と DLL が肥大化し、クラッシュが発生する可能性があります (例:ある DLL のコードが、別の DLL の malloc() によって割り当てられたポインタを使用して free() を呼び出す場合)。
動的にリンクし、ランタイム DLL をプライベート アセンブリとして展開することで、両方の長所を活用できます。これは単に、ランタイム DLL とそのマニフェストを含む特別な名前のディレクトリのコピーを実行可能ファイルの隣に置くことを意味します。
次のセクション「Visual C++ ライブラリ DLL をプライベート アセンブリとして展開する」を参照してください。 http://msdn.microsoft.com/en-us/library/ms235291(VS.80).aspx 詳細については詳しく説明しますが、基本的にアプリケーションは次のようになります。
c:\Program Files\My App\MyApp.exe
c:\Program Files\My App\MyLibrary.dll
c:\Program Files\My App\Microsoft.VC80.CRT\Microsoft.VC80.CRT.manifest
c:\Program Files\My App\Microsoft.VC80.CRT\msvcr80.dll
最後の質問に関しては、はい、ターゲット マシンが動作するには正しいバージョンのランタイム DLL が必要ですが、それらをプライベート アセンブリとして展開することで、それが保証されます。
もう 1 つの利点は、管理者以外のユーザーがアプリを (プログラム ファイルではなく他の場所に) インストールできることです。WinSxS 領域にファイルを書き込むためのアクセス許可は必要ありません。
他のヒント
あなたはランタイムの複数のコピーを取得します唯一の時間です。彼らはしている場合は、<私>すべてのの静的ライブラリとのDLLないが、彼らはすべて一緒にリンクし、あなたのライブラリのすべてが同じランタイムを共有することになります。
これは、リンカの仕事です。
...それは静的に... DLL地獄を修正しようとしたがうまく...ちょうど静的リンケージを使用してインストールに余分な200Kを追加することを働いていないでください。
静的ライブラリは静的に他の静的ライブラリにリンクする必要がドント。あなただけのあなたの主なプロジェクト内のすべての静的ライブラリをリンクする必要があります。こうすることで、コンパイラは、複数のシンボルに文句を言うことはありません。