Instalar una biblioteca localmente en el directorio de inicio, pero el programa no la reconoce

Instalar una biblioteca localmente en el directorio de inicio, pero el programa no la reconoce

Estoy instalando un programa en un servidor como usuario no root. Específicamente es tmux 1.5, pero en mi opinión, esto debería aplicarse ampliamente a todos los programas instalados localmente (menciono el nombre del programa en caso de que este problema termine no siendo mi propio error).

El programa requiere que instale algunas bibliotecas dependientes (por ejemplo, libevent y ncurses). Entonces, los instalé a ambos localmente ya que no tengo acceso de root.

cd $HOME/library/installation/folder
DIR=$HOME/local
./configure --prefix=$DIR 
#... make ... make install 

Ahora, para instalar el programa, también tuve que incluir los paquetes de la biblioteca:

cd $HOME/program/installation/folder
./configure --prefix=$DIR CFLAGS="-I$DIR/include" LDFLAGS="-L$DIR/lib"
#... make ... make install 

Ok, esto instala el programa sin problemas en $HOME/local/bin, pero si ejecuto el ejecutable: $HOME/local/bin/tmux, aparece el siguiente error:

tmux: error al cargar bibliotecas compartidas: libevent-2.0.so.5: no se puede abrir el archivo de objeto compartido: no existe tal archivo o directorio

Me parece que el programa no puede encontrar las bibliotecas deseadas, pero el archivo libevent-2.0.so.5 sí existe en $HOME/local/lib como se especifica en las opciones de configuración. Me pregunto cómo puedo hacer que el programa reconozca la biblioteca instalada para poder ejecutarse. Intenté poner enlaces simbólicos en $HOME/lib, $HOME/bin y $HOME/local/bin, pero ninguno de ellos funcionó. Cualquier idea y sugerencia será muy apreciada.

Respuesta1

Intente reconstruir libevent usando

./configure --disable-shared

Sospecho que esto solucionará su problema porque la biblioteca se vinculará cuando se cree el binario y no será necesario buscarla en tiempo de ejecución.

Alternativamente, si necesita un libevent vinculado dinámicamente, puede agregar el directorio que contiene libevent-2.0.so.5 a su variable de entorno LD_LIBRARY_PATH:

export LD_LIBRARY_PATH=${HOME}/local/lib/:${LD_LIBRARY_PATH}

Respuesta2

También puede configurar el RPATH, quecodifica el parche de búsqueda de la biblioteca en el propio binario.

Sólo agrega -R $DIR/liba CFLAGS.

Respuesta3

he preguntadouna pregunta similar, curiosamente también sobre la construcción tmuxde todas las cosas, aunque todavía estoy seguro de que esto no debería aplicarse a cualquier situación en la que GNU configurey makese usen juntos.

Creo que un enfoque más limpio es utilizar el llamado "rpath", la ruta de búsqueda de la biblioteca integrada en el binario. El -rpathcambio de al menos el enlazador GNU ldpermite especificar la "rpath".

La línea de comando de compilación tendría entonces el siguiente aspecto:

PKG_CONFIG_PATH=/path/to/libevent/lib/pkg-config LDFLAGS=-Wl,-rpath,/path/to/libevent/lib ./configure ...

No es realmente primordial aquí, pero PKG_CONFIG_PATHlo anterior es simplemente la forma recomendada de hacer lo que la gente lograría enviando manualmente -L/path/to/libevent/lib -I/path/to/libevent/includeal ./configurescript. Cuando compilas libevent, instala sus propios archivos de configuración pkg-config(que son utilizados por ./configure). Deberías usarlo, porque sólolibevent definitivamentesabe qué interruptores se deben utilizar al construir contra él.

De todos modos, en algunas situaciones, -rpathes un enfoque más limpio para resolver el problema.

LD_LIBRARY_PATH-Sin embargo, las soluciones basadas en le permiten hacer malabarismos con la biblioteca utilizada por su binario compilado en tiempo de ejecución, lo cual a veces es deseable. Pero si solo desea compilar en una biblioteca en particular que ha colocado en un lugar dedicado en su carpeta de inicio en algún lugar, creo que -rpathlas soluciones basadas en - deben considerarse una respuesta canónica.

Lo extraño es por qué tmuxlos propios scripts de compilación no infieren esta ruta a partir de la ruta de búsqueda de la biblioteca durante la compilación. Quizás no lo necesiten ni deban hacerlo, no lo sé. ¿Será casualidad que esto nos haya pasado a los que construimos tmux?

Respuesta4

No hubo suerte con los demás, pero esto funcionó para mí, desdeaquí:

sudo ln -s /usr/local/lib/libevent-2.0.so.5 /usr/lib64/libevent-2.0.so.5

información relacionada