usando una tienes siguientes sierra requieren puede porque permisos permiso para operación necesario mac los high externo esta elemento duro disco dar completar carpeta cambiar archivos archivo adicionales acceder abrir macos linker dylib

macos - una - no se puede completar la operación porque no tienes el permiso necesario high sierra



Vinculación a una biblioteca dinámica en una Mac con una ruta completa (4)

Estoy vinculando una biblioteca (extensión de Python) que incrusta el motor de Matlab con el siguiente comando (generado mediante 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

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 intento usar la biblioteca, aparece 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 debe al hecho de que el enlazador incluye los archivos dylib de matlab en la forma @loader_path/libeng.dylib lugar de usar la ruta completa, aunque proporciono la ruta completa a g++ . ¿Cómo puedo forzar al enlazador a usar la ruta completa?

Sé que una solución es usar

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

que es donde residen esos archivos de biblioteca, pero me gustaría evitar eso, ya que causa algunos otros problemas.


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


Cambiando 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 usar esto como una solución temporal, pero me pregunto si no hay una solución mejor en la que el enlazador tenga una configuración para usar las rutas completas.


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 crítica aquí es:

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


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