我正在尝试设置一个使用libtool库和exectuable混合的automake项目,并且我很难熟悉automake文档,尤其是。与告诉编译器链接相关。
有人可以解释LDADD
和LIBADD
之间的差异吗?
类似的事情:
-lname_of_library
样式值与直接文件名,
等每当我尝试阅读相关文档时,似乎它都假定我知道我不知道的事情。
答案 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
可以指定:
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
我构建库时会对此依赖项进行编码,并将其传递给库的使用者。
经验法则是: