C++ アプリケーション - ライブラリには静的リンクを使用する必要がありますか? 動的リンクを使用する必要がありますか?

StackOverflow https://stackoverflow.com/questions/2095363

質問

私は、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)
    • 指摘したように、静的コンパイルと静的コンパイルのコンパイルのサイズと期間は異なります。ダイナミックはそれほど大きな違いはないようです
    • より簡単かつ迅速なテストサイクル
    • すべての開発を維持できます。私の開発でサイクルします。機械
役に立ちましたか?

解決

静的リンクはいわれのない非難を持っています。我々は、これらの日の巨大なハードドライブを持っており、非常に脂肪のパイプ。動的リンクの賛成で、古い引数の多くは、今の方法あまり重要でます。

プラス、そこにLinux上で静的リンクを好む1つの本当に良い理由は次のとおりです。そこにプラットフォーム構成の過多は、静的にリンクすることなく、それらのも、ごく一部にまたがって実行可能な意志の仕事を保証することはほとんど不可能にする。

私はこれが人気の意見ではありません疑います。ファイン。しかし、私は、Linux上のアプリケーションの展開を11年間経験してきた、とLSBは本当に離陸し、実際にそれのリーチを拡張するようなものまで、Linuxははるかに困難にデプロイするアプリケーションにもしていきます。あなたは幅広いプラットフォーム間で実行する必要がある場合はそれまでは、静的に、アプリケーションをリンクます。

他のヒント

私はおそらく、開発(ほとんどの)中に動的リンクを使用して、最終的発展の段階と、(すべての)展開のための静的リンクに切り替えるでしょう。幸いなことに、ライブラリの静的リンクにダイナミックに切り替える余分なテストのために少し必要があります。

これは、静的リンクのための別の投票です。私はアプリケーションのための時間を結ぶ有意に長い気づいていません。問題のアプリは通常のマシン、100〜10,000コアを持つほとんどのスーパーコンピュータのうちの束用にコンパイルされた複数のライブラリで、〜50Kラインコンソールアプリです。静的リンクでは、あなたは簡単にそれらの新しいバージョンをテストすることができ、使用しようとしている正確に何ライブラリを知っています。

一般的に、これはほとんどのMacのアプリが構築されている方法です。これは、インストールが簡単にシステムにディレクトリをコピーすることを可能にするものです。

ベストパッケージャにそれを任せるとのconfigure /メイクスクリプトで両方のオプションを提供することです。通常、動的リンクは、セキュリティ上の脆弱性などが発見され、すなわち時に、必要なときにライブラリをアップグレードすることは簡単だろう、それ以来の好みを持っているでしょう。

あなたはそれが最初の任意の必要な動的ライブラリを別の場所になりますよう、プログラムをコンパイルすることができ、システムディレクトリ内のライブラリをインストールするには、root権限を持っていない場合、これはELFバイナリでの実行パスのディレクティブを設定することによって達成されることに注意してください。あなたは、リンカldの-rpathオプションで、このようなディレクトリを指定することができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top