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.
davy.ai
Solución
El problema es que
libbar
no está siendo referenciado correctamente en el Makefile. Para resolver esto, necesitamos agregar la ruta alibbar.la
usando la opción-L
, y especificarlibbar.la
usando la opción-l
para GCC.Para arreglar el Makefile, podemos añadir la ruta a
libbar.la
enlibbar_la_LIBADD
usando la opción-L
, de la siguiente manera:Aquí,
$(top_builddir)
es el directorio raíz del árbol de construcción, ysubmodules/bar
es la ruta al submódulobar
.A continuación, en
libfoo_la_LIBADD
, podemos eliminarlibbar.la
y permitir que el enlazador lo resuelva automáticamente usando la opción-rpath-link
:Finalmente, necesitamos agregar la opción
-rpath-link
amain_LDADD
para indicarle al enlazador dónde buscarlibbar.la
:Aquí, le estamos diciendo al enlazador que busque
libbar.la
en el directorio$top_builddir/submodules/bar
, y que enlace conlibfoo.la
.Después de realizar estos cambios, ejecuta
make clean && make
para reconstruir el proyecto, y luego ejecutamake install
. Esto debería resolver el problema con el enlazador que no puede encontrarlibbar
.