web-dev-qa-db-ja.com

ネストされた静的ライブラリの依存関係は可能ですか?

私はQTで働いています。

  1. 静的ライブラリは別の静的ライブラリに依存できますか?(静的ライブラリは別の静的ライブラリをリンクすることによって作成されます)
  2. はいの場合、lib2にリンクした後、生成されたlib(lib1)にlib2のすべてのコードが含まれていない可能性がありますか?

私のQtプロジェクトでは、複数のライブラリに依存する静的ライブラリを使用しています。すべてのライブラリー(プロジェクトのすべてのヘッダーを含む)を追加する必要がありましたが、コードに必要なライブラリー(およびそのクラスの.h)は1つだけです。

シナリオを説明してください。

12
sk patra

これに関する私の簡単な2ビット:10(申し訳ありませんが、ひどい冗談)。

少し拡大するには、ここに行きます:

1-静的ライブラリは、別の静的ライブラリ、何もない、または動的ライブラリに依存する可能性があります。最初の2つのインスタンスでは、新しい静的ライブラリのすべてのコードが新しいSLL(静的リンクライブラリ)に組み込まれますが、3番目のオプション、環境によっては、SLLが次のいずれかの結果になる可能性があります。

  • DLL(Dynamic Link Library)から収集した、必要なコードの静的バージョンが含まれます。
  • または、さらに恐ろしいことに、プロジェクトに含まれるときにDLLで出荷する必要があり、静的リンクの全体のポイントを壊すことになる静的ライブラリがあるでしょう。

つまり、はい、静的ライブラリを静的ライブラリにリンクすることができます

2- lib1とlib2が両方とも静的で、lib1がlib2とリンクされている場合、lib2のすべての機能はlib1内で使用できますなし lib2はlib1内で静的にリンクされるため、lib2を含める必要があります(ロシアの人形を考えてください、lib2は小さいです)。

あなたが説明するシナリオでは、静的にリンクされていない、含める必要のある各ファイルで個別の機能を使用できる必要があるため、複数のファイルが必要です。そうでない場合、単一のファイルを含めて問題ありません。

次の例を参考にしてください。静的にリンクされた6つのライブラリへの参照を含む1つの.hファイル:完全に機能させるには、プロジェクトに7つのファイルを含める必要があります。

inclusion example 1

上記の.hファイルから作成された1つのSLLでは、コンパイル時にリンクするために新しいSLLのみを含める必要があります。

inclusion example 2

これがお役に立てば幸いです。

6
GMasucci

何かを宣言するときは、リンク中にそれが利用可能で一意に識別されることを約束します。静的ライブラリは、標準外の形式の定義のコンテナにすぎません。したがって、これには次の影響があります。

1)私はしませんquiteここで求めていることを取得しますが、ある静的ライブラリは別の静的ライブラリに大きく依存することがあります。そのライブラリの定義が実行可能ファイルの最終リンク段階で利用できることを約束します(リンク依存関係として提供することにより)。または、静的libのリンク中に「マージ」します。

2)これに対する答えは、あなたがしなければならない唯一のことは、単にlib1のリンク中にlib2にリンクしないことであるということになります。

私の経験で全体的に見て最良のアプローチは、プライベートなライブラリのみをマージすることです。そうしないと、プロジェクトの他の部分が依存関係を共有していると、クライアントが多重定義シンボル違反に遭遇するからです。

6
Ylisar