c++ automake libtool

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.