LDADD和LIBADD有什么区别?

时间:2014-05-15 18:27:00

标签: c++ automake libtool

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

有人可以解释LDADDLIBADD之间的差异吗?

类似的事情:

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

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

2 个答案:

答案 0 :(得分:32)

对库使用LIBADD主数据库,对可执行文件使用LDADD。如果您正在构建一个依赖于另一个库libfoo.la的libtool库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 :(得分:13)

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

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

它们按优先顺序排列 - 使用最后两个只是要求发现问题,因为他们指的是可能存在或不存在的事物。

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

您应该只指定要链接的库,因此,例如,我的库libfred.la取决于某些数学例程,即它取决于libm。当我为库指定附加库时,我声明:

libfred_la_LIBADD = -lm

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

经验法则是:

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