web-dev-qa-db-ja.com

LDADDとLIBADDの違いは何ですか?

Libtoolライブラリと実行可能ファイルを組み合わせて使用​​するautomakeプロジェクトをセットアップしようとしていますが、automakeのドキュメント、特にespを理解するのに苦労しています。コンパイラにリンクするように指示することに関連しています。

では、誰かがLDADDLIBADDの違いを説明できますか?

のようなもの:

  • 片方がもう片方に使用される場合、
  • どれが-lname_of_libraryスタイル値と直接のファイル名など.

関連するドキュメントを読み込もうとするときはいつでも、自分が知らないことを知っていると想定しているようです。

27
Dave

ライブラリにはLIBADDプライマリを使用し、実行可能ファイルにはLDADDを使用します。 libtoolライブラリ_libfoo.la_をビルドしていて、それが別のライブラリ_libbar.la_に依存している場合は、以下を使用します。

_libfoo_la_LIBADD = libbar.la
_

Libtool以外のライブラリがある場合は、これらを_-L_および_-l_オプションを使用して追加することもできます。

_libfoo_la_LIBADD = libbar.la -L/opt/local/lib -lpng
_

通常は、configureスクリプトを使用してこれらの追加ライブラリを検索し、_AC_SUBST_を使用してそれらを渡します。

_libfoo_la_LIBADD = libbar.la $(EXTRA_FOO_LIBS)
_

プログラムの場合は、単にLDADDを使用します。

_myprog_LDADD = libfoo.la # links libfoo, libbar, and libpng to myprog.
_

境界は少しあいまいな場合があります。 $(EXTRA_FOO_LIBS)が_myprog_LDADD_に追加されている可能性があります。 libtool(_.la_)ライブラリに依存関係を追加し、libtoolを使用してプラットフォーム固有のすべてのリンカーマジックを実行することは、通常、最良のアプローチです。すべてのリンカーメタデータを1か所に保持します。

34
Brett Hale

いずれかの本で述べられているように、LDADDはADDitionalリンカー(LD)アイテム、つまりリンクを実行するときに追加されるアイテムです。これは、たとえば、プログラムを作成する場合などです。 LDADDは以下を指定できます。

  • libtoolファイル(例: lib/libfudge.la
  • ライブラリー-lm、または
  • ライブラリへの完全パス。 /lib/libmagicalwonderland.a
  • リンクフラグとライブラリ(例: -L/opt/lib -lmagical

それらは優先順に並んでいます。最後の2つを使用するのは、存在するかもしれないし存在しないかもしれないものを指し示しているので、単に尋ねるが問題を引き起こすためです。

LIBADDは、使用するADDitional LIBrariesを指定するためのものです。これは、ライブラリを構築するときに使用して、ライブラリを構築または使用するために追加のライブラリが必要であることを指定します。 libfred_la_LIBADD =のように指定されていることがわかります。 libtoolライブラリまたはシステムライブラリを指定するために使用でき、これらのライブラリをライブラリの結果のlibtool .laに配置するため、ライブラリへのリンクに関しては、適切なすべてのライブラリが提供されます。

リンクするライブラリのみを指定する必要があるため、たとえば、私のライブラリlibfred.laはいくつかの数学ルーチンに依存します。つまり、libmに依存します。ライブラリに追加のライブラリを指定すると、次のようになります。

libfred_la_LIBADD = -lm

この依存関係は、ライブラリをビルドするときにエンコードされ、ライブラリのコンシューマにも渡されます。

経験則は次のとおりです。

  • 追加されるもののLIBADD ライブラリーに
  • 追加されるもののLDADD プログラムに
13
Petesh