2009-04-24 23 views
17

Visual Studioプロジェクトで静的または動的にCランタイムライブラリにリンクする必要があるかどうかについての議論を読んでいます。Visual Studio Cランタイムに静的または動的にリンクする必要がありますか?

私のプロジェクトでは、最終実行ファイルと同じランタイムライブラリでビルドする必要があるサードパーティライブラリ(Python、HDF5、Trilinos、Microsoft MPI)が用意されています(そうでなければ、リンクできません)。静的にリンクするとき、これらのライブラリにはそれぞれCランタイムのコピーが含まれます。私は最終的な実行ファイルにはランタイムの複数のコピーが含まれているため、問題の原因となる可能性があることを読んでいます。しかし、同じシンボルが複数定義されていると、リンカーは文句を言ってくれませんか?

私は「DLL Hell」を避けたいと思いますが、ランタイムの複数のコピーで静的にリンクすることによって起こり得る潜在的な間違いを心配しています。私は物事を間違って読みますか?

また、私はVisual Studio 2005を使用していますが、Service Pack 1ランタイムは下位互換性がないと読んでいます。つまり、SP1なしでビルドされたアプリケーションは、同じ名前(たとえばmsvcr80.dll)であっても、SP1 DLLを持つマシン上で実行されませんか?

答えて

23

静的にリンクすると、すべてのEXEとDLLが肥大化し、クラッシュする可能性があります(たとえば、あるDLLのコードが別のDLLのmalloc()によって割り当てられたポインタでfree()を呼び出した場合)。

動的にリンクし、ランタイムDLLをプライベートアセンブリとして展開することで、両方の機能を最大限に活用できます。これは、ランタイムDLLとそのマニフェストを含む特別な名前のディレクトリのコピーを実行ファイルの隣に置くことを意味します。はい、ターゲットマシンが必要、あなたの最後の質問については

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 

詳細はhttp://msdn.microsoft.com/en-us/library/ms235291(VS.80).aspxで、「Visual C++を展開プライベートアセンブリとしてライブラリDLLを」を参照してください、しかし、基本的には、アプリケーションは次のようになりますランタイムDLLの正しいバージョンを動作させることができますが、それらをプライベートアセンブリとして展開することによって、そのことが保証されます。

もう1つの利点は、管理者以外のユーザーがプログラムファイルにではなく、他の場所にアプリケーションをインストールできることです。WinSxS領域にファイルを書き込む権限は必要ありません。

+0

これは私が探していた答えです。プライベートなアセンブリのように私の問題に最も安全な解決策です。並べ替えは、アプリケーションが固定ディレクトリ構造で配布されているという点でMacバンドルを思い出させます。ありがとう! – user76293

+6

ただし、プライベートアセンブリはWindows Updateによって修正されません。したがって、ランタイムライブラリのコピーを最新の状態に保つ必要があります。 http://blogs.msdn.com/larryosterman/archive/2004/04/29/123090.aspx –

+0

私の 'アプリケーション'(My App)フォルダに32ビットのミックスおよび64ビットアプリケーションをサポートします。アセンブリフォルダ名にx32やx64のようなものを単に追加するだけでは、32ビットまたは64ビットのアプリケーションしかない場合にのみプライベートアセンブリを使用できます。 – Patrick

0

静的ライブラリを他の静的ライブラリに静的にリンクする必要はありません。メインプロジェクト内のすべての静的ライブラリをリンクするだけです。そうすれば、コンパイラは複数のシンボルについて不平を言うことはありません。

+0

明確にするには:私はライブラリを相互にリンクしていません。主な実行可能ファイルをリンクすると、複数定義されたシンボルは得られません。しかし、実行可能ファイルにCランタイムが複数コピーされているかどうかはわかりませんが、これは静的にリンクするときに起こります(読んだことの解釈によると間違っているかもしれません)。 – user76293

2

...静的に行うのは... DLL地獄を修正しようとしてもうまくいきません...スタティックリンケージを使ってインストールに余分な200kを追加するだけです。

+0

ランタイムの複数のコピーについて考えていますか?それが私の本当の疑問です。 – user76293

+0

とにかく周りに浮かぶランタイムの複数のコピーがあります。これがWinSxSフォルダの目的です(DLL Hellを修正しようとしています)。混乱するので、独自のランタイムをパッケージ化するだけで、そのような問題は回避されます。 – CookieOfFortune

11

ランタイムの複数のコピーを取得するのは、ライブラリをDLLに静的にリンクするときだけです。各DLLはコピーを取得し、EXEもコピーします。それらがすべてのの静的ライブラリであり、DLLではない場合、それらはすべてリンクされ、すべてのライブラリは同じランタイムを共有します。

これはリンカの仕事です。

関連する問題