2009-11-23 20 views
13

Tengo una aplicación que está dividida en varias bibliotecas con el objetivo de reutilizar el código. En Windows, todo lo que tengo que hacer es colocar los archivos .dll en la misma ruta que el ejecutable y los encuentra automáticamente. En Linux (dado que codifica las rutas a las cosas) debo especificar la variable de entorno LD_LIBRARY_PATH o precargar las bibliotecas antes del ejecutable.Ruta de biblioteca compartida como directorio ejecutable

He visto algunas cosas sobre la incrustación de la ruta utilizando la opción del enlazador de -Wl,-rpath=<PATH> y la he probado usando . como la ruta. Pero eso solo se ve en el directorio de trabajo actual, no en el directorio del ejecutable.

¿Hay alguna manera de especificar en el vinculador que se busque en el directorio del ejecutable para las bibliotecas compartidas de forma predeterminada (como en Windows)?

Gracias! Matt

Respuesta

18

Necesita $ ORIGIN en su RPATH, a través de una opción apropiada para ld u otra herramienta de Darwin. Ver this y this.

Recuerde que $ tiene que terminar realmente en la ruta, por lo que debe citar o escapar en la línea de comandos del enlace.

Actualización: Se puede ver lo que el enlazador en realidad poner en su ejecutable con

readelf -d /path/to/exe | grep RPATH 

Esto es lo que la salida debe ser similar:

0x0000000f (RPATH)    Library rpath: [$ORIGIN] 
+4

Al usar $ ORIGIN, necesita asegurarse de que $ esté cotizado correctamente para que el vinculador realmente lo vea. Desde la línea de comando, quiere "-ruta \ $ ORIGEN" y desde un archivo Makefile que desee "-ruta \ $$ ORIGEN" –

+0

Estoy usando Eclipse y CDT, y estoy poniendo la opción debajo de los indicadores del enlazador misceláneo. Estoy poniendo '-Wl, -rpath = $$ ORIGIN' y en la ventana de salida lo muestra con un solo $. Pero parece que no funciona. Probé varias variaciones, pero no pasa nada. Es como si el enlazador ignorara la bandera. He intentado: -Wl, -rpath = $ ORIGEN -Wl, - rpath = $ ORIGEN -Wl, -rpath =/$ ORIGEN -Wl, -rpath = $ ORIGEN/ -Wl, -rpath =/$ ORIGIN/ etc. – CuppM

+0

¿Utiliza elfdump o el equivalente local para ver qué hay allí? Use ldd y vea lo que dice? – bmargulies

2

envolver su programa en un script de shell:

#!/bin/sh 

PROGRAM_DIRECTORY="`dirname "$0"`" 
export LD_LIBRARY_PATH="$PROGRAM_DIRECTORY" 

"$PROGRAM_DIRECTORY/program_executable" "[email protected]" 

Si ejecuta este script (en lugar de su ejecutable) y nuestro programa se vinculará muy bien.

+0

Sí, eso es lo que he estado haciendo y funciona. La aplicación tiene una versión paralelizada utilizando OpenMPI, y tiene una forma de compartir LD_LIBRARY_PATH. Entonces, actualmente estamos usando esa solución alternativa, pero nos gustaría una forma más fácil de hacer las cosas porque la aplicación (así como el corredor MPI) toma varios indicadores de lo que debe procesar – CuppM

+0

Puede pasar todos los argumentos de su secuencia de comandos al programa con '" $ @ "'. –

Cuestiones relacionadas