Cの静的ライブラリは眉をひそめていますか?[閉まっている]


11

共有ライブラリを持つための2つの引数があります。

  1. ディスク容量を削減するのに役立ちます。
  2. 共有ライブラリが更新されると、それに依存するすべてのバイナリが更新を取得します。

共有ライブラリには主に1つの欠点があります。

  • 彼らは依存性地獄を導入することができます。

デスクトップコンピューターでは、第1の利点はもはや成り立ちません。最近では、ディスク容量の無駄遣いはあまり問題になりません。

静的バイナリを使用すると、パッケージマネージャーの質が向上します。つまり、依存関係の地獄は過去のものになります。プログラムを追加すると、単にバイナリが追加されます。最終的には、ファイルを処理するためのフォルダー。プログラムを削除すると、単にこのファイルが削除されます。依存関係?消えた。

2番目の利点はまだありますが、デスクトップコンピューター上の静的バイナリの利点はそれよりも重要だと思います。つまり、Goのような新しい言語でさえ、共有ライブラリの利点にもかかわらず、すべてのバイナリをコンパイルします。これは利便性のためです。


共有ライブラリの主な利点の1つはもはや大したことではないので、Cの静的ライブラリはまだ嫌われていますか?もしそうなら、なぜですか?


4
Cが使用される主な理由は、最新のデスクトップコンピューターで作業していないためです。
テラスティン

18
@Telastynごめんなさい?私のデスクトップコンピュータにインストールされているソフトウェアのほとんどはCで書かれている
フロリアンMargaine

6
サイドビット-オフサイトは、件名に読んで- 動的リンク考慮有害

6
ダイナミックライブラリの利点の1つは、更新を受信しなくなってから15年経過したクローズドソースゲームのバグ、セキュリティホール、またはハードウェアの問題を回避するためにライブラリを更新できることです。一種のニッチなケースですが、良いゲームは商品ではないため、「別のプログラムを使用するだけ」ではあまり役に立ちません。また、独自のコードをオープンソース化せずにLGPLに準拠することも重要です。
ドーバル

4
共有ライブラリの他の2つの利点を忘れました:1)それらはメモリでも共有されます、2)すべてのリンカーはひどく吸います、そして巨大なバイナリをリンクすることは非常に不快です。バイナリをいくつかの小さなエンティティに分割すると、プロセス全体の許容範囲が広がります。
SKロジック14

回答:


9

あなたの質問の前提には欠陥があります。眉をひそめているのは、それらの背後にある基礎を理解せずに教義と絶対主義に固執していることです(カーゴカルトプログラミング?)。

リンクされたSOの答えは非常にトピックに関する興味深い研究です-質問は-staticオプションを使用してコンパイルが機能しない理由に関するものであり、リンクした答えは静的リンクを使用しないことに関する暴言に過ぎませんでした。Ifがなぜ悪いかについて議論せず、OPが動的リンクを使用することを要求します。残念なことに、正解としてマークされています(次の回答は投票数が2倍で、OPの質問に対する正解です)。正解はそこにありますが、独断的な意見の中に深く隠されているからです。

本当の問題は、静的リンクと動的リンクの長所と短所は何か、いつどちらが優先されるかです。


2
Basileの答え、彼が共有ライブラリの使用を推奨する理由を正確に示しています。 libcのから施設は動的ライブラリを望んでいる。それはない『暴言』あなたはそれに反対するという理由だけで。
コーディグレー14

@Codyにリンクされた回答は、私がそれを暴言と呼んで以来編集されています。私が静的リンクと動的リンクについて保持している唯一の意見は、ニーズに適したものを使用し、「誰かが言った」ので貨物カルトプログラミングの教義に陥るのではなく、選択の長所と短所を理解することです。
mattnz

ええ、「特に...」の部分が追加されました。それが暴言の状態にどのように影響するかはわかりません。もちろん、私はカーゴカルトプログラミングを支持していません。(私の経験では)静的リンクの支持者は、セキュリティの懸念をしばしば見落としたり、過小評価したりするだけです。静的リンクは、1回限りのユーティリティに非常に適しているため、アプリは自己完結型であるため、配布がはるかに簡単になります。ただし、広く展開されるか、実稼働に使用されるアプリは、実際に共有ライブラリにリンクする必要があります。本当の欠点はありません。このレベルのアプリでは、既に展開プロセスが必要です。
コーディグレー14

1
静的リンクが適切な場所の良い例は、私が仕事をしている場所-大きくて複雑な生命に関わるシステムです。重要なモジュールがテストされ、動作が承認されたら、「プロセス」を経ることなく動作を変更してはなりません。ただし、システムの運用上および生命にかかわらない重要な部分(課金およびレポート)には、より堅牢な制御を必要とせず、動的リンクを使用します。
マッテンツ14

7

開発者の観点から見ると、動的リンクは多くの場合、コンパイル/リンク/テストループを大幅に高速化します。

パッケージ管理の観点から、たとえばlibGLを取り上げます。パッケージマネージャーでは、約12種類の実装を利用できます。一部は汎用、一部は特定のグラフィックカードを対象としています。動的にリンクされていなかった場合、libGLとリンクする各プログラムのダースバージョンが必要になります。さもなければ、関数呼び出しほど効率的ではない抽象化の追加レイヤーを考案する必要があります。

Qtのような一般的なライブラリのセキュリティ問題を考えてください。動的リンクを使用すると、Qtでリンクするすべてのパッケージを識別、再コンパイル、デプロイする代わりに、その1つのパッケージを更新するだけで済みます。

静的リンクは、独立して展開されたクローズドソースアプリケーションでは利点があるかもしれませんが、オープンソースパッケージ管理では、役立つ以上の害をもたらします。


2
これは本当です(開発をスピードアップします)が、それが本番になったことに本当にイライラしています。標準的な例はFirefoxです。Firefoxが妥当な時間内にロードされるように動的リンクシンボル解決を高速化するために費やされたエンジニアリングの努力(恐ろしいハックの形で)はまったくおかしいです。プロジェクト内のすべてのコードを静的リンクするだけであれば(必要に応じてシステムライブラリとプラグインを動的にリンクしている場合)、はるかに少ないエンジニアリングコストではるかに優れたパフォーマンスを達成できます。
R .. GitHub STOP HELP ICE

5

基本的にあなたの理由#2のため、Linuxディストリビューションのメンテナーは共有ライブラリを強く推奨します。たとえば、zlibセキュリティバグを見つけた場合、zlibを使用するプログラムを1つずつ再コンパイルする必要がないことは非常に重要です。再コンパイルすると、ディストリビューションを使用するすべてのユーザーは、それらのプログラムをすべて再ダウンロードする必要があります。その間、ディストリビューションによって提供されるパッケージのセット内では、すべてがライブラリのセットで動作するようにテストされているため、依存関係の地獄は問題になりません。

ディストリビューションにないライブラリを必要とするサードパーティのソフトウェアを構築している場合、それらのライブラリを静的にリンクすることは、他のライブラリよりも手間がかからない可能性があります。

他に知っておくべき重要なことは、GNU libcとGCCのlibstdc++両方に、ライブラリが静的にリンクされていると確実に動作しないコンポーネントがあることです。最も一般的な問題は、dlopenロードするモジュールdlopen自体が動的にリンクされるためlibc.so.6です。つまり、アドレス空間にCライブラリの2つのコピーが存在することになり、内部mallocデータ構造のコピー(たとえば)が信頼できるかどうかについて同意が得られない場合は、喜びが続きます。何かを持っているように見えない関数の全体の束を:それは悪くなるdlopenように、gethostbynameそしてiconv、使用dlopen内部的に(その動作が実行時設定可能になるように)。幸いなことに、libcとlibstdc ++のABIは非常に安定しているため、それらを動的にリンクする際に問題が発生することはほとんどありません。


2

mattnzの最後の点に同意します。この質問は、ロードされた質問です。静的リンクが悪いと仮定します。これが当てはまらない2つの理由を考えることができます。

  • 静的リンクは安全です:アプリケーションが新しいライブラリを使用するように共有ライブラリが更新された場合(新しいライブラリが古いライブラリを上書きするか、古いライブラリが削除される可能性があります)、新しいバージョンがアプリケーションを破壊するリスクが生じる可能性があります。これは、アプリケーションの公式アップデートの範囲外のコード変更です。テストされていない可能性があります。静的リンクは、ライブラリを外部で共有しないことでこれを回避します。このリスクのため、これは共有ライブラリにとって不利だと思います。共有ライブラリの新しいバージョンが特定の古いアプリケーションを破壊する新しいバグを導入した場合はどうなりますか?

  • 静的リンクにより、アプリケーションはより自己完結型になります。共有ライブラリはプライマリ実行可能ファイルと同じ場所に配置できますが、多くの場合、共有ライブラリに配置されます。静的にリンクされたアプリケーションは、「OSが所有するファイル、ディレクトリ、または設定の変更を必要としない」という意味で「ポータブル」を保証するのが簡単です(Windowsディレクトリ、レジストリ、/ etcを考えてください)。


私が言及したい利点を改善してくれてありがとう。ただし、たとえばLinuxディストリビューションによって提供されるほとんどのパッケージが表示される場合、それらは静的にコンパイルされていません。ない、少なくともビューの外部の点から、静的コンパイルが眉をひそめているように見えます。
フロリアンマーゲイン14

1
最近のほとんどすべてのOS上の動的ライブラリは、要求に応じてページインされます。実際に使用されているページのみがメモリにあります。複数のアプリケーションが同じ機能を使用している場合、それらはメモリを共有し、静的ライブラリの場合よりも使用量が少なくなります。複数のアプリが同じライブラリで異なる機能を使用している場合、両方の機能セットがページインされ、静的アプローチとほぼ同じ影響があります。
アランシュトコ14

@AlanShutkoあなたが言ったことのために、私はいくつかの方法でその部分を苦労して再入力しました。たとえ最新のオペレーティングシステムが実際に静的ライブラリのオーバーヘッドを伴う共有ライブラリの効率を提供しても、いずれの方法でも本当の保証はありません。もう一度編集します。

@スノーマン基本的なポイントは、動的リンクを提供する現実的なオペレーティングシステム(動的リンクを使用しているがページングを要求しないOSは知らない)では、あなたの2番目のポイントは水を保持しないことだと思います:メモリは実際には使用されません関数が使用され、動的ライブラリで使用されるメモリがそれを使用する異なるプログラム間で共有される場合を除き、動的バージョンのメモリ使用量をより少なくするよりも効率的にします。最初の理由と3番目の理由は有効ですが、2番目の理由を削除するだけです。現実的な仮定があれば、それは間違っています。
ジュール14

@Jules私は同意します、それは現代のオペレーティングシステムで問題があり、疑わしい妥当性のある点です。削除しました。

1

静的ライブラリと動的ライブラリにはそれぞれ独自の用途があります。スコープ内の単一のアプリケーションを見ると、必要なものとそうでないものについて異なる考えが得られます。

静的リンクは、アプリケーションの展開を大幅に簡素化します。異なるバージョンを検出して対処する必要はありません。焼いて展開するだけです。

動的ライブラリの明らかな利点は、更新を個別に適用できることです。

これが、私がMavenやその他のJava用のダイナミックリンクプロジェクトビルダーを嫌う理由の1つです。彼らは、特定のURLで単一のライブラリバージョンがいつまでも利用できることを期待しています。すべてのソースとjarがなくなったために、誰もアプリケーションをコンパイルできない10年後に発生する問題を理解していません。


使用FooLib1.8するプログラムが標準の方法で実行可能パッケージにそのライブラリのコードを含めることができないようにするために特別な理由はありますFooLib1.9か?Classic Macintoshでのコードの保存方法は、これを非常に簡単にしました。今日のシステムではそれ以上改善できないはずの理由はありますか?
supercat 14

@supercatは、特定のライブラリのすべてのバージョンがシステムで利用できるということですか?質問を理解したかどうかわかりません。OPの質問は、システム全体の共有ライブラリではなく、一緒にパッケージ化される静的ライブラリに向けられていました。
多くのポテトチップス14

私のポイントは、実行可能パッケージに必要なすべてのライブラリを含めることで、そこに含まれるライブラリをアップグレードする可能性を排除する必要がないことです。したがって、アプリケーションをライブラリにバンドルしないことの利点として、展開後に物事をアップグレードできることを考慮すると考えるかどうかはわかりません。
supercat 14

特定のライブラリのライセンスでパッケージと一緒に配布することが許可されている場合、それが常に推奨される方法です。外部依存関係の数を減らします。すべてを配布するため、アップグレードまたはパッチ適用のメカニズムは、静的または動的に同じ方法で動作します。通常、バイナリデルタに基づいたパッチ適用。違いはありません。
多くのポテトチップス14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.