Estoy construyendo mi programa en mi computadora, en el cual libtiff.so -> libtiff.so.5 . Y luego empujando las compilaciones en otra máquina en la que libtiff.so -> libtiff.so.4 .
En tiempo de ejecución, mi programa existe: «error al cargar bibliotecas compartidas: libtiff.so.5 : no se puede abrir el archivo de objeto compartido: no existe tal archivo o directorio».
No puedo actualizar la otra máquina y me gustaría evitar compilar en una máquina virtual (con la misma versión de Linux que la máquina ejecutora). Por lo tanto, me gustaría obligar al compilador a usar libtiff.so.4 en lugar de libtiff.so.5 .
Tengo libtiff.so.4 instalado en mi computadora (así como libtiff.so.5 ). ¿Cómo puedo forzar el enlace con esta versión en lugar de la versión más nueva? Pensé en mover libtiff.so -> libtiff.so.4 , pero tengo miedo de romper mi sistema si necesita la última versión ( apt-get purge libtiff5 da un error porque algún otro paquete lo necesita).
¿Es posible vincular con una versión anterior (instalada) de una biblioteca? Si es así, ¿cómo? ¿Y es dañino cambiar el enlace simbólico de libtiff.so a la versión anterior? Si no, ¿resolverá mi problema?
Puede usar esta sintaxis para vincular a una versión específica de una biblioteca:
gcc [otras opciones] -l:libtiff.so.4
No necesita especificar una ruta; se buscan los directorios habituales para encontrar la biblioteca.
Nota: como mencionó Michael Wild, debe tener instalados los archivos de encabezado para esa versión en lugar de los más nuevos.
Como han mencionado otros, puede forzar el enlazador especificando el nombre completo de la versión, o incluso la ruta absoluta.
Sin embargo, recomendaría encarecidamente no hacerlo. El problema es que los encabezados instalados corresponden a la versión más nueva de la biblioteca. Si ha habido cambios que rompieron la API/ABI entre estas versiones de la biblioteca, el programa podría funcionar, bloquearse de forma intermitente o, si tiene suerte, no funcionar en absoluto.
En su lugar, debe instalar temporalmente el paquete de desarrollo que corresponde a la biblioteca libtiff.so.4. Si está en Debian/Ubuntu o similar, este sería el paquete libtiff4-dev .
Especifique la ruta completa al .so: en lugar de -ltiff pase /lib64/libtiff.so.4 al enlazador.