2009-03-02 19 views
9

¿Cuál es el mejor lugar para configurar la variable específica de aplicación LD_LIBRARY_PATH en Solaris? ¿Cómo funciona ¿Dónde establecer LD_LIBRARY_PATH en Solaris?

LD_LIBRARY_PATH

trabajo variable?

actualidad configurarlo en .kshrc, pero diferentes aplicaciones necesitan diferentes versiones del marco de mensajería, pero estas aplicaciones se ejecutan bajo el mismo uso y, por tanto, que necesitarían diferentes LD_LIBRARY_PATH, por lo que en su opinión lo que es el mejor lugar para establecer este ¿variable?

Básicamente, estoy tratando de descubrir cómo hacer que esta ruta de acceso variable forme parte de la aplicación en lugar de ser específica para el entorno del usuario.

Respuesta

14

Normalmente solo tengo un script de shell que inicia la aplicación. En el script de shell, establecería LD_LIBRARY_PATH en lo que sea que necesite para esa aplicación, y luego haré que el script inicie esa aplicación. Hacerlo de esa manera debería hacer que la ruta se establezca solo para esa aplicación.

+0

Gracias, eso es lo que estaba pensando. Sin embargo, ¿tendría sentido colocar esa variable en el archivo app_profile externo y luego obtener ese archivo en el script? ¿O ves algún problema con eso? Estoy pensando que, dado que varias aplicaciones necesitan la misma ruta, podría tener sentido externalizarla. –

+0

LD_LIBRARY_PATH (o LD_LIBRARY_PATH_32 y LD_LIBRARY_PATH_64) debe establecerse antes de que se ejecute el ejecutable, porque ld.so.1 lo lee antes de llegar a main() y no vuelve a leerlo después. –

+0

@Ville - Creo que funcionaría, pero primero querrá probarlo para estar seguro –

6

Puede encontrar una descripción formal de LD_LIBRARY_PATH en la página de manual de "ld.so.1", es decir, ejecutar "man ld.so.1". También describe algunas otras variables que son honradas por el enlazador de tiempo de ejecución.

Además de LD_LIBRARY_PATH, los archivos ejecutables y las bibliotecas compartidas también pueden tener una ruta de búsqueda integrada para las bibliotecas. Si está ejecutando una aplicación que se ha vinculado usted mismo, puede usar la opción ld -R para establecer la ruta incorporada (tanto Sun CC como gcc tienen opciones para hacer lo mismo). Esto puede permitirle evitar el uso de LD_LIBRARY_PATH en primer lugar.

-1

Usted puede utilizar el comando crle:

crle -l/ruta/a/su/lib/archivo

+1

crle sufre del mismo problema que configurarlo en un archivo de entorno global: afecta a todas las aplicaciones, por lo que no ayuda cuando diferentes aplicaciones necesitan diferentes versiones de las bibliotecas. – alanc

+0

alanc tiene razón. –

+1

@alanc está * mal *. 'crle -c' le permitirá afectar aplicaciones específicas (vea el Ejemplo 6 en http://docs.oracle.com/cd/E19082-01/819-2239/crle-1/index.html) – vladr

1

La respuesta crle es más correcta. En Solaris, no se debe usar LD_LIBRARY_PATH. Use crle en su lugar. Para ver las rutas actuales, simplemente ejecute "crle" por sí mismo. Para actualizar la lista, use crle -u -l /path/to/your/lib/directory. Se necesita -u para escribir cambios en la configuración del sistema; de lo contrario, el cambio será temporal. Vea la página man para más opciones.

+2

Como se señala en los comentarios sobre la respuesta crle anterior, no es la mejor solución, ya que afecta a * todos * los programas, no solo a los rotos que necesitan una ruta diferente de la que fueron creados. Un contenedor de script de shell para establecer LD_LIBRARY_PATH solo para esas aplicaciones es mucho más seguro y más seguro que arriesgarse a los cambios en todos los programas, y es la única forma de tratar con diferentes aplicaciones que necesitan rutas incompatibles. – alanc

+2

@alanc, incorrecto; puede usar 'crle -c' para definir entornos por aplicación, como los manifiestos de Windows (vea el Ejemplo 6 en http://docs.oracle.com/cd/E19082-01/819-2239/crle-1/index. html). – vladr

0

Acabo de encontrar un caso en que la LD_LIBRARY_PATH global no surta efecto, tuve que ajustar una secuencia de comandos y establecer LD_LIBRARY_PATH antes de la aplicación. crle es una buena solución global si instaló muchas librerías bajo/opt/csw/lib, a través de pkgutil de blastwave.

0

Puede verificar su archivo .profile o .profile.user. Habrá una entrada comentada para él. No se recomienda su uso ya que está roto. Debe construir los binarios pasando valores a indicadores en lugar de usar La variable.

2

Vladr, alanc es correcto.

No se recomienda establecer LD_LIBRARY_PATH en Solaris. En absoluto.

Si necesita hornear un runpath específico en su biblioteca o ejecutable, , entonces debe usar el distintivo -R para el enlazador. Si compila con gcc, entonces use -Wl, Rpath (creo).

Si necesita hacer esto para un paso posterior a la compilación (por ejemplo, porque falta el origen para volver a compilar), entonces elfedit (1) le ayudará mucho. Está documentado en la página de manual, y también en la Guía de Linker + Libraries en http://docs.oracle.com/cd/E26502_01/html/E26507/index.html

+0

Por razones de compatibilidad, GCC en Solaris también entiende '-R'. Todavía puede usar '-Wl, -Rsomedir' porque es portátil para Linux. O use '-Wl, -rpath, somedir' que también se entiende, p. mediante un enlazador de tiempo de ejecución en Solaris y Linux. – maxschlepzig

Cuestiones relacionadas