Cómo configurar mi entorno de tal manera que se utilice una versión adecuada (diferente a la del sistema) de la biblioteca

Cómo configurar mi entorno de tal manera que se utilice una versión adecuada (diferente a la del sistema) de la biblioteca

Supongo que esta pregunta es un límite entre ServerFault, StackOverflow y este sitio. Pero creo que U&L es más relevante.

Tengo un C++código que depende de una biblioteca en versión Xy el sistema proporciona la versión Y(X>Y). Compilé esta biblioteca y coloqué los archivos resultantes en . /opt/lib_name/X/libLa versión Yestá instalada en /usr/lib64. Quiero vincularme a sobibliotecas.

Ahora me gustaría crear un script que de alguna manera habilite la versión X, de modo que cualquier código que construya gccse compile con la versión Xsin ningún cambio en los archivos MAKE.

Por ahora configuro LIBRARY_NAME_DIRla variable y en el archivo MAKE solo agrego -L $LIBRARY_NAME_DIR, lo que funciona pero requiere que cambie los archivos MAKE.

¿Hay alguna forma de hacer este tipo de cosas sin tener acceso de root a la computadora?

Nota: si bien creo que la respuesta a esta pregunta no depende de la biblioteca específica o del código, todos los detalles de mi problema particular están aquí:https://stackoverflow.com/q/24189130/7918.

Lo que he probado:

  • He puesto: LIBRARY_PATH, LD_LIBRARY_PATH, CPLUS_INCLUDE_PATH.

Respuesta1

No creo que haya ninguna manera de hacer esto de manera sólida únicamente con variables ambientales. El problema con el uso LIBRARY_PATHparece ser que cualquier -Lopción tiene prioridad. Si por alguna razón el gcccomando tiene -L/usr/lib64, se buscará primero y se encontrará la versión anterior de la biblioteca. Al parecer vas a cambiar los Makefiles, también debes tener cuidado de que -L/usr/lib64no aparezca primero.

Sin embargo, al observar su pregunta SO, no parece que lo anterior sea un problema. Sin embargo, hay un seguimiento innecesario :en el valor de su LIBRARY_PATHvariable, lo que podría explicar por qué no funcionó.

Además, como se indica en la respuesta a la pregunta SO, LD_LIBRARY_PATHlo utiliza el vinculador dinámico y solo es relevante entiempo de ejecuciónpara su aplicación. Esto se puede utilizar si no se puede encontrar la ubicación de las bibliotecas dinámicas cuando se ejecuta la aplicación. Lo que utiliza el enlazador GNU es LD_RUN_PATH, que esencialmente hace -rpathlo que LIBRARY_PATHhace para -rpath, excepto que especifica cualquier -rpathmedio que LIBRARY_PATHse ignorará (y no solo se le dará menor prioridad).

Lo que podrías probar entonces es:

LIBRARY_PATH=/opt/lib_name/X/lib LD_RUN_PATH=/opt/lib_name/X/lib make

Algo que podría ser más sólido es crear un script contenedor que gccincluya las opciones necesarias, por ejemplo:

#!/bin/sh
gcc -L/opt/lib_name/X/lib -Wl,-rpath,/opt/lib_name/X/lib "$@"

Asigne un nombre al archivo gcc, hágalo ejecutable y colóquelo en un directorio aparte (o al menos en uno donde no haya archivos con el mismo nombre que los comandos vitales). Entonces podrías ejecutar makecomo:

PATH=/path/to/script:$PATH make

información relacionada