Pregunta

Estoy vinculación de un (extensión de Python) biblioteca que incorpora el motor de Matlab con el siguiente comando (generada a partir de cmake)

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

resulta 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 que el problema se deriva del hecho de que el enlazador incluye los archivos de Matlab dylib en forma @loader_path/libeng.dylib en lugar de utilizar la ruta completa, a pesar de que la ruta completa a g++. ¿Cómo puedo forzar al enlazador a utilizar 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.

¿Fue útil?

Solución

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 

Podría utilizar esto como una solución temporal, pero me pregunto si no hay una mejor solución en la que se da el enlazador un ajuste para utilizar las rutas completas.

Otros consejos

Tenga en cuenta que algunos de los problemas con DYLD_LIBRARY_PATH se pueden prevenir mediante el uso de DYLD_FALLBACK_LIBRARY_PATH lugar. Esto sólo se puede utilizar si el lib no se puede encontrar en las rutas predeterminadas.

Mira en la opción -rpath al comando ld para controlar esto. Usted también puede estar interesado en el contenido de https://github.com/bimargulies/jni-origin -testbed, que es una demostración de una tecnología relevante.

La técnica fundamental aquí es:

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

También puede usar el enlace simbólico!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top