13

Boostライブラリ、log4cxx、またはgoogleロギングライブラリの一部を含む一連のライブラリに依存する新しいC ++プロジェクトを開始します。プロジェクトが進化するにつれて、他のライブラリも進化します(まだ予測できません)。 。

32ビットシステムと64ビットシステムの両方で実行する必要があります。おそらく、必要なすべてのライブラリやsu特権が利用できるとは思わない、非常に多様なLinux環境で実行する必要があります。

私の質問は、これらすべてのライブラリに動的または静的にリンクしてアプリケーションを構築する必要があるかどうかです。

ノート:

(1)静的リンクは開発中に苦痛になる可能性があることを認識しています(コンパイル時間の延長、32ビットと64ビットの両方のクロスコンパイル、依存関係チェーンを下げてすべてのライブラリを含めるなど)が、テスト中ははるかに簡単です-ファイルを移動して実行するだけです。

(2)一方、動的リンクは開発段階で簡単になります-コンパイル時間が短く(32ビット開発環境から64ビットライブラリへの動的リンクを処理する方法がよくわかりません)、依存関係の連鎖に煩わされることはありません。一方、新しいバージョンの展開は醜い場合があります。特に、新しいライブラリが必要な場合(対象のマシンにsu権限がない、またはこれらのライブラリが利用できないという上記の条件を参照)。

(3)このトピックに関連する質問を読みましたが、どのアプローチが私のシナリオに最も適しているかを実際に理解できませんでした。

結論:

  1. ご意見ありがとうございました!
  2. 私はおそらく静的リンクを使用します。理由は次のとおりです。
    • より簡単な展開
    • パフォーマンス中の予測可能なパフォーマンスとより一貫した結果。テスト(このペーパーを参照してください:http://www.inf.usi.ch/faculty/hauswirth/publications/CU-CS-1042-08.pdf)
    • 指摘したように、静的と動的のコンパイルのサイズと期間はそれほど大きな違いではないようです
    • より簡単でより速いテストサイクル
    • 私はすべての開発者を維持することができます。私の開発者のサイクル。マシーン
4

4 に答える 4

12

静的リンクには悪いラップがあります。最近は巨大なハードドライブと非常に太いパイプがあります。ダイナミックリンクを支持する古い議論の多くは、今ではそれほど重要ではありません。

さらに、Linuxで静的リンクを好む本当に良い理由が1つあります。プラットフォーム構成が多すぎるため、静的リンクなしで実行可能ファイルがそれらのごく一部でも機能することを保証することはほとんど不可能です。

これは世論ではないと思います。罰金。しかし、私はLinuxにアプリケーションをデプロイした11年の経験があり、LSBのようなものが実際に普及し、その範囲を実際に拡大するまで、Linuxはアプリケーションをデプロイするのがはるかに困難であり続けます。それまでは、さまざまなプラットフォームで実行する必要がある場合は、アプリケーションを静的にリンクしてください。

于 2010-01-19T18:09:36.553 に答える
4

私はおそらく、開発中(ほとんど)に動的リンクを使用し、その後、開発と(すべて)展開の最終段階で静的リンクに切り替えます。幸い、ライブラリの動的リンケージから静的リンケージに切り替えるときに、追加のテストはほとんど必要ありません。

于 2010-01-19T17:17:57.853 に答える
3

これは静的リンクに対する別の投票です。アウトアプリケーションのリンク時間が大幅に長くなっていることに気づいていません。問題のアプリは約50Kのラインコンソールアプリであり、通常のマシン、ほとんどが100〜10,000コアのスーパーコンピューター用にコンパイルされた複数のライブラリを備えています。静的リンクを使用すると、使用するライブラリを正確に把握でき、それらの新しいバージョンを簡単にテストできます。

一般に、これはほとんどのMacアプリが構築される方法です。これにより、インストールでディレクトリをシステムにコピーするだけで済みます。

于 2010-01-19T18:16:28.643 に答える
1

それをパッケージャに任せて、configure/makeスクリプトで両方のオプションを提供するのが最善です。通常は動的リンクが優先されます。それ以降、必要に応じて、つまりセキュリティの脆弱性などが発見された場合に、ライブラリを簡単にアップグレードできます。

システムディレクトリにライブラリをインストールするためのroot権限がない場合は、必要なダイナミックライブラリを最初に他の場所で検索するようにプログラムをコンパイルできます。これは、ELFバイナリでrunpathディレクティブを設定することで実現されます。このようなディレクトリは、リンカldの-rpathオプションを使用して指定できます。

于 2010-01-19T17:19:53.483 に答える