2010-12-22 15 views
40

Quiero establecer en Mac OSX la ruta de tiempo de ejecución de un archivo ejecutable (para el vinculador) en tiempo de compilación, de modo que el vinculador dinámico al inicio del programa encuentre las bibliotecas compartidas en ubicaciones no estándar.¿Cómo establecer la ruta del tiempo de ejecución (-rpath) de un archivo ejecutable con gcc en Mac OSX?

Bajo Linux esto es posible con -Xlinker -rpath -Xlinker /path/to (o el uso de -Wl,-rpath,/path/to) y bajo Solaris se puede añadir -R/path/to a la línea de comandos del compilador.

He encontrado some information que Mac OS X gcc tiene -rpath apoyo desde 10,5, es decir, desde 2008. ~

Traté de conseguir que funcione con un mínimo ejemplo - sin éxito:

$ cat blah.c 
int blah(int b) 
{ 
    return b+1; 
} 

Y :

$ cat main.c 

#include <stdio.h> 

int blah(int); 

int main() 
{ 
    printf("%d\n", blah(22)); 
    return 0; 
} 

Compilado de esta manera:

$ gcc -c blah.c 
$ gcc -dynamiclib blah.o -o libblah.dylib 
$ gcc main.c -lblah -L`pwd` -Xlinker -rpath -Xlinker `pwd`/t 

Ahora la prueba:

$ mkdir t 
$ mv libblah.dylib t 
$ ./a.out 
dyld: Library not loaded: libblah.dylib 
    Referenced from: /Users/max/test/./a.out 
    Reason: image not found 
Trace/BPT trap 

Así, la pregunta: ¿Cómo puedo configurar la ruta de tiempo de ejecución para el enlazador en Mac OS X?

Por cierto, ajuste DYLD_LIBRARY_PATH funciona, pero no quiero usar este truco.

Editar: En cuanto otool -L:

$ otool -L a.out 
a.out: 
     libblah.dylib (compatibility version 0.0.0, current version 0.0.0) 
     /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.1) 

Parece que otool -L sólo imprime los nombres de biblioteca (y probables los lugares en tiempo de enlace) el ejecutable fue enlazado con y sin información de ruta en tiempo de ejecución.

+0

no tengo un sistema OS X, pero buscar alrededor, [install_name_tool] (http://developer.apple.com/ library/mac/# documentation/Darwin/Reference/ManPages/man1/install_name_tool.1.html) puede agregar rpaths a su binario. No estoy seguro de por qué el suyo no funciona, ¿qué dice 'otool -L'? – ephemient

Respuesta

32

encontrado por experimentación, y la inspección de las líneas de comando generadas por Xcode para un reference rpath demo project by Dave Driblin:

otool -L que muestra el nombre de la instalación de las librerías enlazadas. Para obtener @rpath a trabajar, es necesario cambiar el nombre de la instalación de la biblioteca:

$ gcc -dynamiclib blah.o -install_name @rpath/t/libblah.dylib -o libblah.dylib 
$ mkdir t ; mv libblah.dylib t/ 
$ gcc main.c -lblah -L`pwd`/t -Xlinker -rpath -Xlinker `pwd` 
+1

Sí, esto funciona. Dado que existen semánticas de -rpath en otro sistema operativo tipo Unix, la implementación de la desviación de manzanas parece un poco incómoda. Al menos deberían documentarlo en su versión de la página man de gcc. – maxschlepzig

+0

@Karel es correcto, pero [esto] (http://dev.lsstcorp.org/trac/wiki/LinkingDarwin) también puede ser útil si desea una lista más completa de alternativas. – cdunn2001

Cuestiones relacionadas