LDADD和LIBADD的区别是什么?

What is the difference between LDADD and LIBADD?

本文关键字:是什么 区别 LIBADD LDADD      更新时间:2023-10-16

我正在尝试设置一个使用libtool库和可执行文件混合的automake项目,并且我很难找到automake文档,特别是与告诉编译器链接到。

那么有人能解释一下LDADDLIBADD的区别吗?

这样

:

  • 当一个在另一个之上使用时,
  • 哪一个采用-lname_of_library风格值与直接文件名,等。

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

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完成所有特定于平台的链接器魔术,通常是最好的方法。它将所有链接器元数据保存在一个地方。

正如其中一本书中提到的,LDADD是附加链接项——即在执行链接时添加的项。例如,在制作程序时。LDADD可以指定:

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

它们是按偏好顺序排列的——使用后两个只是找麻烦,因为它们指向的东西可能存在,也可能不存在。

LIBADD用于指定要使用的附加库。这在构建库时使用,以指定需要其他库才能构建或使用该库。您将看到它被指定为类似libfred_la_LIBADD =的内容。它可以用来指定libtool库,或者系统库,并将这些库放置到libtool .la库中,这样当你链接到库时,你就可以得到所有合适的库。

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

libfred_la_LIBADD = -lm

该依赖项在构建库时被编码,并传递给库的消费者。

经验法则是:

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