%20de%20la%20biblioteca.png)
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 X
y el sistema proporciona la versión Y
(X>Y). Compilé esta biblioteca y coloqué los archivos resultantes en . /opt/lib_name/X/lib
La versión Y
está instalada en /usr/lib64
. Quiero vincularme a so
bibliotecas.
Ahora me gustaría crear un script que de alguna manera habilite la versión X
, de modo que cualquier código que construya gcc
se compile con la versión X
sin ningún cambio en los archivos MAKE.
Por ahora configuro LIBRARY_NAME_DIR
la 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_PATH
parece ser que cualquier -L
opción tiene prioridad. Si por alguna razón el gcc
comando 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/lib64
no 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_PATH
variable, lo que podría explicar por qué no funcionó.
Además, como se indica en la respuesta a la pregunta SO, LD_LIBRARY_PATH
lo 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 -rpath
lo que LIBRARY_PATH
hace para -rpath
, excepto que especifica cualquier -rpath
medio que LIBRARY_PATH
se 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 gcc
incluya 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 make
como:
PATH=/path/to/script:$PATH make