Pregunta

Tengo una biblioteca A, que desarrollo. Cuando lo despliegue en una máquina, los correspondientes libA.so y libA-X.Y.Z.so se colocan en / usr / lib (siendo X.Y.Z el número de la versión).

Ahora desarrollo una biblioteca B, que usa A. Cuando vinculo B, uso el indicador -lA. Luego " ldd libB.so " me da:

(...)
libA-X.Y.Z.so => /usr/lib/libA-X.Y.Z.so
(...)

Mi problema es que cuando lanzo una nueva versión de A (XYZZ), también tengo que lanzar una nueva versión de B. De lo contrario, alguien que instale la última A no podrá instalar B, que buscaré para la versión XYZ que no existe.

¿Cómo resuelvo este problema? ¿Cómo puedo decirle a B que busque libA.so y no libA-X.Y.Z.so? ¿O es incorrecto hacerlo? incluso inseguro?

Actualización 1 : la biblioteca A (que heredé de otra persona) usa autotools.

Actualización 2 : cuando construyo la biblioteca A, puedo ver: " -Wl, -soname -Wl, libA-0.6.1.so " . Si entiendo bien, significa que estamos obligando a que soname sea libA-0.6.1.so . Está bien ? Ahora mi problema es que no tengo ni idea de cómo modificar este comportamiento en un proyecto que utiliza autotools. Busqué en Google por un tiempo pero no puedo encontrar ninguna información útil. ¿Debo modificar configure.in o Makefile.am?

¿Fue útil?

Solución

Cuando cree libA.so, pase la opción -soname al vinculador (si se vincula a través de gcc, use -Wl, -soname). Luego, cuando B se vincula, el vinculador se refiere a A a través de su nombre, no a través de su nombre de archivo. En el sistema de destino, asegúrese de tener un enlace desde el nombre de soname al archivo real. Ver

http: //www.linux. org / docs / ldp / howto / Program-Library-HOWTO / shared -raries.html

Otros consejos

Esto también funciona en Windows como " DLL hell " :).

Si B necesita una versión específica de A y usted se vincularía a libA, no a libA-X.Y.Z, la sustitución de libA con una versión más reciente podría hacer que B no se cargue o se bloquee.

Pero, por supuesto, puede hacer un enlace simbólico de libA-X.Y.Z a libA-X1.Y1.Z1. Si no se modificaron las API y solo las implementaciones deben ser seguras.

Respondiendo a mi segunda actualización: En Makefile.am de libA, modifiqué _la_LDFLAGS de -release a -avoid-version . Esto creó una biblioteca compartida sin número de versión y luego recompilé libB que se vinculó exitosamente con esta biblioteca compartida no versionada.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top