LDADD和LIBADD有什么区别?

Dav*_*ave 25 c++ automake libtool

我正在尝试设置一个使用libtool库和exectuable混合的automake项目,而且我很难熟悉automake文档,尤其是.与告诉编译器链接相关.

因此,有人可以解释之间的差异LDADDLIBADD

像:

  • 何时使用另一个,
  • 哪一个采用-lname_of_library样式值与直接文件名等.

每当我尝试阅读相关文档时,似乎它假定我知道我不知道的事情.

Bre*_*ale 34

LIBADDprimary用于库和LDADD可执行文件.如果您正在构建一个libfoo.la依赖于另一个库的libtool库,那么libbar.la您将使用:

libfoo_la_LIBADD = libbar.la
Run Code Online (Sandbox Code Playgroud)

如果你有其他非libtool的库,你也将有添加这些-L-l选项:

libfoo_la_LIBADD = libbar.la -L/opt/local/lib -lpng
Run Code Online (Sandbox Code Playgroud)

通常,您将使用configure脚本来查找这些额外的库,并使用AC_SUBST它们来传递它们:

libfoo_la_LIBADD = libbar.la $(EXTRA_FOO_LIBS)
Run Code Online (Sandbox Code Playgroud)

对于一个程序,只需使用LDADD:

myprog_LDADD = libfoo.la # links libfoo, libbar, and libpng to myprog.
Run Code Online (Sandbox Code Playgroud)

有时边界有点模糊.$(EXTRA_FOO_LIBS)本来可以加入myprog_LDADD.将依赖项添加到libtool(.la)库,并使用libtool所有特定于平台的链接器魔术,通常是最好的方法.它将所有链接器元数据保存在一个位置.


Pet*_*esh 13

正如其中一本书中所提到的,LDADD是ADDitional链接器(LD)项 - 即在执行链接时添加的项.例如,这将是在制作节目时.LDADD可以指定:

  • libtool文件,例如 lib/libfudge.la
  • 库,例如-lm,或
  • 图书馆的完整路径,例如 /lib/libmagicalwonderland.a
  • 链接标志和库,例如 -L/opt/lib -lmagical

它们按照优先顺序排列 - 使用后两者只是寻找麻烦,因为他们指的是可能存在或可能不存在的事物.

LIBADD是指定要使用的ADDitional LIBraries.在构建库时指定需要使用其他库来构建或使用库时使用此方法.你会看到它被指定为类似的东西libfred_la_LIBADD =.它可用于指定libtool库或系统库,并将这些库放入库的结果.la库中,因此在链接到库时,您将获得所有相应的库.

您应该只指定要链接的库,因此,例如,我的库libfred.la依赖于某些数学例程,即它依赖于libm.当我为库指定其他库时,我声明:

libfred_la_LIBADD = -lm
Run Code Online (Sandbox Code Playgroud)

我构建库时会对此依赖项进行编码,并将其传递给库的使用者.

经验法则是:

  • LIBADD用于添加到库中的内容
  • LDADD用于添加到程序中的内容

  • 你指的是哪些书? (2认同)