2011-08-18 10 views
14

Cómo compilar e instalar un módulo .so con autotools/libtool sin tener las bibliotecas .la y .a instaladas también en --prefix path?Construyendo el módulo .so con autotools/libtool sin las variantes .la y .a instaladas

Actualmente estoy usando Makefile.am siguiente:

lib_LTLIBRARIES = libCurlDownloader.la 
libCurlDownloader_la_SOURCES = Curl.cpp 
libCurlDownloader_la_LDFLAGS = -module -avoid-version 

Funciona, pero además de libCurlDownloader.so también instala libCurlDownloader.la y libCurlDownloader.a, lo que es indeseable.

Actualización # 1

Es posible hacer .a no ser generados, ya sea mediante el uso de

./configure --disable-static 

o

AC_ENABLE_SHARED(yes) 
AC_ENABLE_STATIC(no) 

en configure.ac

Pero todavía es la pregunta de cómo hacer .la no b eing instalado en la instalación --prefix al tener .so instalado.

Actualización # 2

Es posible eliminar los archivos .la de la instalación usando --prefix

install-exec-hook: find $(DESTDIR)$(libdir) -type f -name \*.la -delete 
+0

Tiene un error tipográfico menor (debe ser install-exec-hook). – Compholio

+0

Creo que no se puede, los empacadores de Debian están eliminando manualmente los archivos de la deb en los paquetes de deb – sherpya

+0

Que 'install-exec-hook' parece una mala idea. Quitaría todos los archivos .la del directorio, no solo los generados por su proyecto. No es un gran problema si se usa 'DESTDIR', pero si no es así. – Maarten

Respuesta

1

Usted no necesariamente debe eliminar los archivos .la. Los archivos .la contiene información que se utiliza en dos situaciones:

  1. estáticamente une en contra de la biblioteca construida. Al vincular estáticamente (es decir, .a con -static), no hay información sobre las dependencias de la biblioteca que se está enlazando, por lo que libtool puede usar la información en el archivo .la para crear un comando ld apropiado que haga referencia a todas las dependencias necesarias. Esto a menudo es más importante en un entorno como MinGW donde el vinculador requiere los mismos múltiplos especificados en la biblioteca en un orden particular para resolver dependencias recursivas. Esto es solo una preocupación si uno tiene la intención de construir un binario estático.

  2. dinámicamente cargar la biblioteca Construir sobre algunos plataformas (es decir, con lt_dlopen si se utiliza libltdl). Del mismo modo, en ciertas plataformas, las dependencias del módulo de compilación no están codificadas en el binario, por lo que el archivo .la es necesario para que lt_dlopen encuentre y cargue las dependencias correctas. En plataformas ELF (incluidas Linux) y plataformas PE (es decir, Windows), las dependencias se almacenan en la biblioteca, por lo que lt_dlopen funcionará sin los archivos .la. El formato MachO en MacOS puede requerir archivos .la al compilar paquetes.

Los empaquetadores de Debian/Ubuntu han decidido excluir .la archivos de sus paquetes debido a que la segunda razón no es apropiado en Linux y que preferirían que no construyeron binarios estáticos en el primer lugar. En otras plataformas, que libtool está diseñado para admitir, los archivos .la pueden ser necesarios para vincular o ejecutar el programa.

+2

Para dependencias de enlace estáticas; casi siempre hay (incluso más a menudo que los archivos .la existentes) las instrucciones 'pkg-config' están disponibles. –

+3

Similar: incluso para la vinculación dinámica 'pkg-config' ofrece una mejor ayuda que las muletas libtool; en forma independiente del sistema de compilación. –

2

Me encontré con esta pregunta porque usaba el término "módulo", que en automake/libtool speak es el término para un complemento. Tengo un sistema de complemento en Finit, así que construyo mis complementos con '-module' para evitar crear archivos .a. Pero todavía tengo instalados los archivos .la, que en realidad ni siquiera son aplicables en el caso '-module'.

todavía tengo que encontrar una manera documentada para saltar .la archivos de plugins, pero aquí es cómo lo hago:

AM_LDFLAGS = -module -avoid-version -shared 
pkglib_LTLIBRARIES = alsa-utils.la bootmisc.la 

install-exec-hook: 
     @(cd $(DESTDIR)$(pkglibdir) && $(RM) $(pkglib_LTLIBRARIES)) 

Para que quede claro, en mi caso de uso no hay nadie va a "enlace" contra mi complemento .so, por lo que los archivos .la realmente no sirven de nada.

+0

¿Lo has encontrado? Realmente odio esto –

+0

@iharob nope, sigue usando esa regla de gancho para limpiar los archivos .la. El proyecto es [aquí] (https://github.com/troglobit/finit) si desea ver más detalles. – troglobit

Cuestiones relacionadas