2016-04-12 8 views
1

を使用している共有ライブラリへのC++アプリケーションをリンクする必要があり、あなたが、私は、C++アプリケーションを記述する場合、既存のC++共有ライブラリlibAlpha1.solibAlpha2.solibAlpha3.soなどを利用したC++の共有ライブラリlibBeta.soをコンパイルしましょうlibBeta.soを直接使用する(したがって、間接的に他のライブラリを使用する)場合、アプリケーションをlibBeta.soにのみリンクするか、アプリケーションをすべてのライブラリにリンクする必要がありますか?は、私は間接的

libBeta.soはすでに他のライブラリにリンクされているため、すべてのライブラリへのリンクが冗長であると思われるため、libBeta.soにリンクする必要があると私の直感でわかります。しかし、undefined reference toのエラーは私の直感が間違っていることを証明しています。

誰かが私の直感が特定のケースで間違っているかもしれない理由を説明できますか?

PS:

  • OS:Linuxの
  • コンパイラ:G ++

EDIT

それは私がコンパイルのために使用したツールはコンパイルするための異なる振る舞いを持ち結局のところ実行可能ファイルと共有ライブラリをコンパイルします。共有ライブラリをコンパイルするときのサブライブラリーへのリンクは省略されていた:(

+0

あなたは定義されていない参照リンカーエラーが発生したと言いますが、それらのエラーの内容を教えてください。 –

答えて

4

共有ライブラリは完全に実体をリンクされている、とあなたは明示的に依存関係にリンクする必要はありません。

これはある静的ライブラリとは違って静的ライブラリを使用する場合は、にはの依存関係のリンクが必要ですが、共有ライブラリの場合は必要ありません。

未定義の参照がある場合は、あなたがリンクしている共有ライブラリの依存関係。あなた自身のコードとリンクしていないか、実際には静的ライブラリ。

+0

あなたが描く行動はまさに私が期待するものですが、それは私が得ているものではありません。私は、C++ライブラリの大規模なコレクションで構成されるフレームワークを使用しています。私は必要なフレームワークの部分とインターフェイスする共有ライブラリを作成しました。次に私はmain()しか持っていない単純なテストアプリケーションを書いて、私のライブラリから1つの関数を呼び出します。私のライブラリのみにリンクしていると、私のアプリケーションは正しくコンパイルされませんが、すべてのライブラリにリンクすれば正常に動作します。そして、はい、すべての依存関係が共有ライブラリであるかどうかを確認しました。 – Aeronaelius

3

あなたは直接の依存関係、libBeta.soにリンクする必要があります。

実際には、いくつかのLinuxディストリビューションでは、実行可能ファイルに間接的な依存関係があることを避けることができます - この場合、例えばlibAlpha1.so - 依存関係が実行時にロードされる限り、間接的には、依存関係は満足するだろう。

This is no longer the case

+0

私は同意しますが、[this](https:// stackoverflow。com/questions/36573081/should-i-link-a-c-application-to-shared-libraries-indirect-indirectly/36573308#comment60745566_36573165)コメント – Aeronaelius

+0

これは、共有ライブラリを正しくリンクしていないことを意味します。共有ライブラリの1つは、別の共有ライブラリのシンボルを参照しますが、リンクされていません。 –

+0

正しく理解すれば、 'libBeta.so'を依存関係の1つにリンクするのを忘れてしまったと言います。そのため、アプリケーションをコンパイルするときにすべてのサブ依存関係にリンクする必要があります。 'libBeta.so')? – Aeronaelius

関連する問題