2011-09-22 11 views
5

私はSFMLで作業していましたが、少しテストプログラムをコンパイルし、リンケージオプション-lsfml-audioを追加しました。次に、私はldd ./programを使って、リンクしていた動的ライブラリを見ました。驚いたことに、たくさんのものがありました。私は自分のmakefileで手動で選択したものがなく、pkg-config --libsも使用していませんでした。共有ライブラリの依存関係をリンクする

私は共有ライブラリについて読んで始め、疑問を解決するための小さな例を作りました。いくつかのライブラリが自動的にそれらの依存関係をリンクあなたのメイク (手動またはpkg-configのようなスクリプトを使用して)、およびその他の のライブラリに依存関係を追加するあなたを必要とする理由

:しかし、私はこの質問がありますか?

あなたがダイナミックライブラリを作成している、ユーザーが後で手動で依存関係を追加する手間を避けるためにg++ -shared ...コマンドで適切な-ldependencyオプションを追加することと同じくらい簡単です。なぜ利用可能なライブラリの多くはそれをしていないのですか?

私はそれがリンクされるライブラリなどの微調整の能力に関係していなければならないと思います。

答えて

6

共有ライブラリは通常、依存関係にリンクします。しかし、静的ライブラリはそうすることができません。 pkg-config --libsには、ライブラリの依存関係を追加することなく、単に-staticを追加するだけでスタティックコンパイルに切り替えることができるように、すべての依存関係(直接的および間接的)が含まれることがよくあります。

これらの過剰な直接の依存関係は、ライブラリのsonameの遷移を必要以上に大変なものにするので、パッケージ化されたバイナリでは避けようとする場合があります。 -Wl,--as-neededフラグが不要な最終実行ファイルから直接の依存関係を取り除くようにリンカーに指示できます。

+0

私はここでいくつかの名前を呼び出す必要があると思います:共有ライブラリは通常依存関係を引き出しません( '* .la'ファイルを見ると' libtool'です)。ダイナミックローダは共有ライブラリの '.NEEDED'ヘッダからそれらを把握するので、それらをインクルードする必要はありません。 'libtool'が紹介しているオーバーリンクの問題に加えて、リンク時にシンボル定義を探す必要があるため、ビルドをたくさん遅くす​​ることができます。 –

+0

@honk、はい、libtoolはこれらの問題の原因の1つです。しかし、pkg-configスクリプトもそれを実行できます。いずれにせよ、ELFプラットフォームでは必ずしも必要ではありません。直接使用するものだけをリンクする必要があります(これには、インライン関数やマクロ経由で使用されるものが含まれます) – bdonlan

関連する問題