c++ - ¿Cuál es la diferencia entre LDADD y LIBADD?
automake libtool (2)
Estoy tratando de configurar un proyecto de automake que utiliza una combinación de librerías libtool y ejemplos, y me está costando mucho encontrar la documentación de automake, especialmente en lo que se refiere a decirle al compilador que vincule en contra.
Entonces, ¿alguien puede explicar las diferencias entre LDADD
y LIBADD
?
Cosas como:
- cuando se usa uno sobre el otro,
- cuál toma valores de estilo de
-lname_of_library
vs. nombres de archivos directos, etc.
Cada vez que trato de leer la documentación relevante, parece que asume que sé cosas que no sé.
Como se mencionó en uno de los libros, LDADD
son elementos de vinculador ADICIONAL (LD), es decir, elementos que se agregan al realizar el enlace. Esto sería, por ejemplo, al producir programas. LDADD
puede especificar:
- archivos libtool, por ejemplo,
lib/libfudge.la
- bibliotecas, por ejemplo,
-lm
, o - rutas completas a las bibliotecas, por ejemplo,
/lib/libmagicalwonderland.a
- enlaces banderas y bibliotecas, por ejemplo,
-L/opt/lib -lmagical
Están en orden de preferencia: usar los dos últimos es solo pedir problemas, ya que están señalando cosas que pueden o no estar presentes.
LIBADD
es para especificar bibliotecas adicionales a utilizar. Esto se usa cuando se construye una biblioteca para especificar que se necesitan bibliotecas adicionales para construir o hacer uso de la biblioteca. Lo verás especificado como algo así como libfred_la_LIBADD =
. Se puede usar para especificar las bibliotecas libtool o las bibliotecas del sistema y colocará estas bibliotecas en la biblioteca liblaol resultante .la
para la biblioteca, de modo que cuando se trata de establecer vínculos con la biblioteca, obtenga todas las bibliotecas adecuadas.
Solo debe especificar las bibliotecas para vincular, así que, por ejemplo, mi biblioteca libfred.la
depende de algunas rutinas matemáticas, es decir, depende de libm
. Cuando estoy especificando las bibliotecas adicionales para la biblioteca, declaro:
libfred_la_LIBADD = -lm
Esta dependencia se codifica cuando construyo la biblioteca y también se transmite a los consumidores de la biblioteca.
La regla de oro es:
- LIBADD para cosas que se agregan a una biblioteca
- LDADD para cosas que se agregan a un programa
Use el LIBADD
primario para bibliotecas y LDADD
para ejecutables. Si estuvieras construyendo una biblioteca libtool libfoo.la
, que dependiera de otra biblioteca libbar.la
, libbar.la
:
libfoo_la_LIBADD = libbar.la
Si tuviera otras bibliotecas que no sean libtool, también las agregaría con las opciones -L
y -l
:
libfoo_la_LIBADD = libbar.la -L/opt/local/lib -lpng
Normalmente, usaría el script de configuración para encontrar estas bibliotecas adicionales y usaría AC_SUBST
para pasarlas con:
libfoo_la_LIBADD = libbar.la $(EXTRA_FOO_LIBS)
Para un programa, simplemente use LDADD
:
myprog_LDADD = libfoo.la # links libfoo, libbar, and libpng to myprog.
A veces los límites son un poco vagos. $(EXTRA_FOO_LIBS)
podría haberse agregado a myprog_LDADD
. Por lo general, el mejor enfoque es agregar dependencias a una biblioteca libtool ( .la
) y usar libtool
hacer todo el mágico enlazador específico de la plataforma. Mantiene todos los metadatos del enlazador en un solo lugar.