2009-12-20 13 views
18

estoy vinculación de un (extensión de Python) biblioteca que incorpora el motor de Matlab con el siguiente comando (generaron utilizando cmake)La vinculación a una biblioteca dinámica en un Mac con ruta completa

c++ -mmacosx-version-min=10.6 -bundle -headerpad_max_install_names -o library.so library.o /Applications/MATLAB_R2009b.app/bin/maci64/libeng.dylib /Applications/MATLAB_R2009b.app/bin/maci64/libmx.dylib -framework Python 

resultando en

$ otool -L library.so 
library.so: 
    @loader_path/libeng.dylib (compatibility version 0.0.0, current version 0.0.0) 
    @loader_path/libmx.dylib (compatibility version 0.0.0, current version 0.0.0) 
    /System/Library/Frameworks/Python.framework/Versions/2.6/Python (compatibility version 2.6.0, current version 2.6.1) 
    /opt/local/lib/gcc44/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.13.0) 
    /opt/local/lib/gcc44/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0) 
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.0.0) 

Sin embargo, cuando trato de utilizar la biblioteca, me sale un mensaje de error:

ImportError: dlopen(./library.so, 2): Library not loaded: @loader_path/libmex.dylib 
    Referenced from: ./library.so 
    Reason: image not found 

creo el problema surge del hecho de que el enlazador incluye los archivos dylib de matlab en el formato @loader_path/libeng.dylib en lugar de usar la ruta completa, aunque doy la ruta completa a g++. ¿Cómo puedo forzar al enlazador a usar la ruta completa?

Sé que una solución es utilizar

export DYLD_LIBRARY_PATH=/Applications/MATLAB_R2009b.app/bin/maci64:$DYLD_LIBRARY_PATH 

que es donde residen los archivos de la biblioteca, pero me gustaría evitar que, ya que causa otros problemas.

+0

favor refiérase mi respuesta en este enlace [Add_libray] [1] [1]: http://stackoverflow.com/questions/4876740/xcode-keeps-searching-dylib-at-wrong- ruta/19245310 # 19245310 – itechnician

Respuesta

29

cambiar manualmente los archivos usando install_name_tool

install_name_tool -change "@loader_path/libeng.dylib" "/Applications/MATLAB_R2009b.app/bin/maci64/libeng.dylib" library.so 
install_name_tool -change "@loader_path/libmx.dylib" "/Applications/MATLAB_R2009b.app/bin/maci64/libmx.dylib" library.so 

que podría utilizar esto como una solución temporal, pero me pregunto si no hay una solución mejor donde el enlazador tiene una configuración para usar las rutas completas.

+2

esto es útil, pero tiene razón, debería haber una forma de hacerlo en CMake – eqzx

+0

Terminé necesitando hacer la operación inversa; reemplazando una ruta absoluta con una que implica '@ loader_path'. La [página dyld man] (https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/dyld.1.html) fue útil para explicar el comportamiento de Dyld en lo que respecta a rutas absolutas y expansión de '@ loader_path'. – nornagon

5

Mire en la opción -rpath al comando ld para controlar esto. También podría estar interesado en los contenidos de https://github.com/bimargulies/jni-origin-testbed, que es una demostración de alguna tecnología relevante.

La técnica fundamental aquí es:

install_name_tool -change libsl2.so "@loader_path/libsl2.so" libsl1.so 
+1

¿Podría elaborar un poco más sobre esto? Estoy teniendo el mismo problema. ¡Siento que algunos de los caminos en mi proyecto construido no están buscando el lugar correcto! – Yasin

-2

¡También puede usar un enlace simbólico!

+1

¿Has leído otras respuestas y entiendes el problema? –

6

Tenga en cuenta que algunos de los problemas con DYLD_LIBRARY_PATH pueden evitarse utilizando DYLD_FALLBACK_LIBRARY_PATH en su lugar. Esto solo se usará si la lib no se puede encontrar en las rutas predeterminadas.

+0

Usando esto acaba de romper el shell en el que estaba, y me dio: '' ' python dyld: Biblioteca no cargada: @loader_path /../ lib/libpython2.7.dylib Remitida desde: .../bin/python Motivo: no se ha encontrado la imagen Trace/BPT trap: 5 '' ' –

Cuestiones relacionadas