es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cuando se utiliza LIBADD en Automake, libtool enlaza de forma incorrecta.

Estoy utilizando automake para construir mi proyecto. Tengo algunas bibliotecas de terceros (código abierto) como submódulos de git en mi proyecto que quiero construir e enlazar individualmente. Aquí hay una versión editada (nombres cambiados) de mi Makefile.am:

lib_LTLIBRARIES = libfoo.la libbar.la
libbar_la_SOURCES = ../submodules/bar/bar.c

libfoo_la_LIBADD = libbar.la
libfoo_la_SOURCES = \
    some_source.c \
    some_other_source.c

libfoo_la_CFLAGS = $(CFLAGS)
libfoo_la_LDFLAGS = $(LIBS)

if OS_LINUX
libfoo_la_SOURCES += \
    linux/some_source.c \
    linux/some_other_source.c

libfoo_la_CFLAGS += $(PTHREAD_CFLAGS)
libfoo_la_LDFLAGS += $(PTHREAD_LIBS)
endif

if OS_WINDOWS_MSYS
libfoo_la_SOURCES += \
    nt/some_source.c \
    nt/some_other_source.c

libfoo_la_LDFLAGS += -no-undefined
endif

bin_PROGRAMS = main
main_SOURCES = main.c
main_LDADD = libfoo.la

autoreconf, configure y make se ejecutan normalmente, pero make install falla con el siguiente error:

/usr/bin/ld: no se puede encontrar -lbar
collect2: error: el retorno de ld es 1

Parece que autoconf está intentando usar libbar como una biblioteca global instalada en lugar de una local. Sin embargo, LDADD en el destino main funciona correctamente.

El comando autoreconf -V imprime:

autoreconf (GNU Autoconf) 2.71
Derechos de autor (C) 2021 Free Software Foundation, Inc.
Licencia GPLv3+/Autoconf: GNU GPL versión 3 o posterior
<https: gnu.org/licenses/gpl.html="">, <https: gnu.org/licenses/exceptions.html="">
Este es un software libre: usted es libre de cambiarlo y redistribuirlo.
No hay NINGUNA GARANTÍA, hasta el límite permitido por la ley.

Escrito por David J. MacKenzie y Akim Demaille.

EDIT: Estoy en Linux. No te preocupes por las partes de Windows.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Solución

    El problema es que libbar no está siendo referenciado correctamente en el Makefile. Para resolver esto, necesitamos agregar la ruta a libbar.la usando la opción -L, y especificar libbar.la usando la opción -l para GCC.

    Para arreglar el Makefile, podemos añadir la ruta a libbar.la en libbar_la_LIBADD usando la opción -L, de la siguiente manera:

    libbar_la_LIBADD = -L$(top_builddir)/submodules/bar -lbar
    libbar_la_SOURCES = ../submodules/bar/bar.c
    

    Aquí, $(top_builddir) es el directorio raíz del árbol de construcción, y submodules/bar es la ruta al submódulo bar.

    A continuación, en libfoo_la_LIBADD, podemos eliminar libbar.la y permitir que el enlazador lo resuelva automáticamente usando la opción -rpath-link:

    libfoo_la_LIBADD =
    

    Finalmente, necesitamos agregar la opción -rpath-link a main_LDADD para indicarle al enlazador dónde buscar libbar.la:

    main_LDADD = -rpath-link $(top_builddir)/submodules/bar -lfoo
    

    Aquí, le estamos diciendo al enlazador que busque libbar.la en el directorio $top_builddir/submodules/bar, y que enlace con libfoo.la.

    Después de realizar estos cambios, ejecuta make clean && make para reconstruir el proyecto, y luego ejecuta make install. Esto debería resolver el problema con el enlazador que no puede encontrar libbar.

Comments are closed.