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