2010-08-12 16 views
5

Por lo tanto, estoy construyendo un proyecto y usa funciones de una biblioteca compilada (.dylib o .so). Tengo las cabeceras y los archivos de la biblioteca (todo esto es parte de QtRoot, por cierto) en los lugares adecuados, pero cuando intento de construir mi proyecto en Xcode, me sale un error de depurador:La vinculación está jacked up ... ¿qué es -rpath? MacOS X

dyld: Library not loaded: @rpath/libRIO.so Referenced from: /Users/paulthompson/Documents/Programming/Build Products/Debug/MacHeliosSim.app/Contents/MacOS/MacHeliosSim Reason: image not found sharedlibrary apply-load-rules all Data Formatters temporarily unavailable, will re-try after a 'continue'. (Cannot call into the loader at present, it is locked.)

Ahora, el programa en sí mismo, que se compilará correrá bien si lo abro desde el Finder, pero cada vez que intento ejecutarlo desde Xcode, me falla. ¿Qué es esto de Rpath y por qué el depurador no puede encontrar las bibliotecas, incluso aunque Xcode sepa dónde están, y aparentemente el programa, cuando se ejecuta desde el Finder, también puede encontrarlas?

Respuesta

3

http://en.wikipedia.org/wiki/Rpath_(linking)

Es una ruta almacenada en el binario para encontrar bibliotecas compartidas. Cuando inicia la aplicación desde Finder, ¿es probable que sea un paquete de aplicaciones? Cuando se crean paquetes de aplicaciones, las bibliotecas compartidas se copian en el paquete de la aplicación, y las rutas a las bibliotecas incluidas se vuelven relativas en ese momento. (@executable_path /../ Frameworks/foobar). ¿Cómo se creó la versión que funciona desde Finder?

¿El error anterior ocurre en tiempo de enlace o al iniciar la aplicación desde xcode? (En este último caso, intente con DYLD_LIBRARY_PATH)

Además, la extensión .so para libRIO en lugar de .dylib parece un poco sospechosa.

+0

se ha perdido el paréntesis de cierre en su enlace. –

+0

Correcto, es un paquete .app. Sin embargo, ninguna de las bibliotecas compartidas está en él, a menos que se envuelvan en el binario real. Ni siquiera hay un directorio de frameworks ... De todos modos, el .app se crea haciendo 'build' o 'build and go' desde Xcode. El error surge durante la parte de ir de 'compilar y listo' o si selecciono ejecutar desde dentro de Xcode. El .so, creo, es en realidad un enlace sym al .dylib. Algunos de los archivos de la biblioteca a los que estoy vinculando son archivos .so reales, y otros son .dylib. Creo que incluso hay algunos .a en algún lado, pero puedo estar equivocado. Entonces, ¿estoy perdiendo una – TraxusIV

+0

copia de la fase de compilación de archivos? – TraxusIV

1

Añadir la rpath en la fase de vinculación, como en este (en Qt Creator) ejemplo:

LIBS += -L/usr/local/root/lib -lGui -lCore -lCint -lRIO -lNet -lHist -lGraf -lGraf3d -lGpad -lTree -lRint -lPostscript -lMatrix -lPhysics -lMathCore -lThread -lpthread -Wl,-rpath,/usr/local/root/lib -lm -ldl

Cuestiones relacionadas