私が MFC を使い始めた 90 年代には、アプリを動的にリンクし、関連する MFC DLL を出荷していました。これによりいくつかの問題が発生し (DLL 地獄!)、代わりに静的リンクに切り替えました。MFC だけでなく、CRT と ATL も対象です。より大きな EXE ファイルを除けば、静的リンクで問題が発生したことはまったくありません。他の人が遭遇した欠点はありますか? 動的リンクを再度検討する正当な理由はありますか? 私のアプリは主に STL/Boost 最近 FWIW です。
7 に答える
これについて私が聞いた回答のほとんどは、dll を他のプログラムと共有すること、またはソフトウェアにパッチを当てることなくそれらの dll を更新することに関するものです。
率直に言って、それらは長所ではなく短所だと思います。サードパーティの dll が更新されると、ソフトウェアが壊れるほど変更される可能性があります。そして最近では、ハード ドライブの容量は以前ほど貴重ではなくなりました。誰も気にしない?
- ソフトウェアが使用している dll のバージョンが 100% 確実であることは良いことです。
- クライアントが依存関係の問題を抱えていないことを 100% 確信できるのは良いことです。
私の意見では、長所は短所をはるかに上回っています
いくつかの欠点があります:
- より大きなexeサイズ(複数のexeを出荷する場合は特に)
- ダイナミックリンクに依存または想定している他のDLLを使用する際の問題(例:静的ライブラリとして取得できないサードパーティのDLL)
- 独立した静的リンケージ(クロスモジュール割り当て/割り当て解除なし)を使用したDLL間の異なるcランタイム
- 共有コンポーネントの自動サービスはありません(アプリケーションを再コンパイルおよび更新せずに、サードパーティのモジュールサプライヤーにコードを更新させて問題を修正させることはできません)
Windowsアプリの静的リンクを実行します。これは主に、xcopyの展開を可能にするためです。これは、プロセスとメカニズムが十分に文書化されていないか、簡単にリモートできるため、SxSDLLを適切にインストールまたは依存することでは不可能です。インストールディレクトリでローカルDLLを使用すると、多少は機能しますが、十分にサポートされていません。リモートシステムでMSIを経由せずにリモートインストールを簡単に実行できないことが、動的リンクを使用しない主な理由ですが、(ご指摘のとおり)静的リンクには他にも多くの利点があります。それぞれに長所と短所があります。うまくいけば、これはそれらを列挙するのに役立ちます。
使用を特定のライブラリに制限し、dll を使用しない限り、問題はありません。
残念ながら、静的にリンクできないライブラリがいくつかあります。私が持っている最良の例は OpenMP です。Visual Studio の OpenMP サポートを利用する場合は、ランタイムがインストールされていることを確認する必要があります (この場合は vcomp.dll)。
dll を使用している場合は、いくつかの項目を真剣に取り組まないとやり取りできません。std::strings が思い浮かびます。exe と dll が動的にリンクされている場合、割り当ては CRT で行われます。そうしないと、プログラムが一方に文字列を割り当て、他方で割り当てを解除しようとする可能性があります。悪いことが続く…
そうは言っても、私はまだexeとdllを静的にリンクしています。これにより、インストール時の可変性が大幅に軽減され、いくつかの制限を設ける価値があると思います。
dll を使用する利点の 1 つは、複数のプロセスが同じ dll をロードする場合、そのコードをプロセス間で共有できることです。これにより、メモリを節約し、別のプログラムで既に使用されている dll をロードするアプリケーションのロード時間を短縮できます。
LGPL などの一部のソフトウェア ライセンスでは、DLL を使用するか、ユーザーがリンクできるオブジェクト ファイルとしてアプリケーションを配布する必要があります。このようなライブラリを使用している場合は、おそらく DLL として使用することをお勧めします。
確実に。
割り当ては「静的」ヒープで行われます。割り当てと割り当て解除は同じヒープで行う必要があるため、ライブラリを出荷する場合は、クライアント コードで「your」を呼び出してp = new LibClass()
、 を使用してそのオブジェクト自体を削除できないように注意する必要がありますdelete p;
。
私の結論: クライアント コードから割り当てと割り当て解除をシールドするか、CRT を動的にリンクします。
いいえ、その面で新しいことは何もありません。そのままにしている。