librerias funciones estáticas dinamica creacion compilar bibliotecas biblioteca c++ eclipse build linker libraries

c++ - funciones - Bibliotecas en/usr/local/lib no encontradas



librerias c en linux (1)

Este es un error de tiempo de ejecución, no un error de compilación. Establecer el indicador -L no hace nada para el enlazador de tiempo de ejecución. Lo que debe hacer es decirle al cargador de tiempo de ejecución que también busque en / usr / local / lib para las bibliotecas. Puedes hacer eso de dos maneras. El primero es agregar la ruta a la LD_LIBRARY_PATH entorno LD_LIBRARY_PATH :

export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/lib"

El segundo es actualizar el archivo de configuración del enlazador en tiempo de ejecución. Esto puede suceder en el archivo /etc/ld.so.conf, poniendo la línea:

/usr/local/lib

en algún lugar de ese archivo, o creando un nuevo archivo * .conf en el directorio /etc/ld.so.conf.d/ que contiene la nueva ruta. Por ejemplo:

/etc/ld.so.conf.d/99local.conf

con solo:

/usr/local/lib

en eso. Esta es la forma recomendada de hacerlo, ya que le permite mantener sus rutas de biblioteca personalizadas separadas de las rutas establecidas por el sistema. (El prefijo "99" está allí para asegurarse de que el archivo se cargue por última vez en comparación con otros archivos allí, de modo que no preceda las rutas del sistema que podrían contener las mismas bibliotecas).

Después de modificar / crear el archivo en / etc, debe ejecutar:

ldconfig

como raíz para que el cambio surta efecto. (Este comando actualiza el archivo /etc/ld.so.cache, que es el archivo real utilizado por el vinculador de tiempo de ejecución).

También hay otra forma de que un binario encuentre las bibliotecas necesarias en tiempo de ejecución. En realidad, puede codificar las rutas de la biblioteca en el ejecutable mismo. Esto se logra estableciendo un llamado "rpath". Esta es una opción del enlazador y se debe pasar de gcc (o g ++) al enlazador, por lo que se debe -Wl opción -Wl . La opción del vinculador es -rpath=PATH . Entonces, necesitaría agregar esto a sus banderas de enlace:

-Wl,-rpath=/usr/local/lib

Sin embargo, no recomiendo esto para su caso. Un rpath es útil cuando se envían bibliotecas junto con su ejecutable (quizás con un instalador), y un rpath relativo (usando la función rpath $ORIGIN ) o uno absoluto (para cuando se instala en / opt, por ejemplo) es entonces utilizado para encontrar esas libs agrupadas en tiempo de ejecución.

Estoy construyendo una aplicación usando un marco llamado ohNet . Después de construir el marco, existe la posibilidad de instalar el marco a través de make install . Por defecto, las bibliotecas se instalan dentro de las carpetas /usr/local/[lib|include] . De acuerdo.

Estoy usando eclipse para el desarrollo. Para utilizar estas bibliotecas tengo que establecer la ruta de inclusión a la biblioteca (en este caso usr/local/include/ohNet ), establecer la ruta de búsqueda del enlazador (-L) ( /usr/local/lib/ohNet ) y específica libraries (-l) (en este caso elijo una biblioteca llamada libohNet.so que está en esta carpeta. Cuando construyo el proyecto en eclipse funciona bien, sin embargo, si intento ejecutar el programa me encuentro con el siguiente mensaje:

error while loading shared libraries: libohNet.so: cannot open shared object file: No such file or directory

¡He comprobado esto dos libohNet.so , y el archivo libohNet.so está en este directorio! ¿Cuál es la razón por la que este archivo no se puede encontrar?

Busqué en Google y encontré algunas publicaciones, diciendo que es problemático que las bibliotecas se instalen en /usr/local/lib lugar de /usr/lib consulte aquí ... ¿Tengo que configurar algunas configuraciones adicionales en eclipse para crear ld reconocer las bibliotecas en este camino? ¿Cuál es la solución para esto?

Saludos