Come faccio a dire a MacPorts Python di cercare in / opt / local / lib per dylibs?

1

Sto eseguendo uno script Python con la versione MacPorts di Python (2.7), cioè, ho eseguito:

port select --set python python27

Tuttavia, quando eseguo il mio script, non riesce a trovare un dylib in /opt/local/lib :

ImportError: dlopen(/opt/local/lib/python2.7/site-packages/grgsm/_grgsm_swig.so, 2): Library not loaded: libgnuradio-grgsm.dylib
Referenced from: /opt/local/lib/python2.7/site-packages/grgsm/_grgsm_swig.so
Reason: image not found

Il dylib in questione si trova qui:

-rwxr-xr-x  1 root  admin    816036 Dec 16 11:24 /opt/local/lib/libgnuradio-grgsm.dylib

L'impostazione export DYLIB_LIBRARY_PATH=/opt/local/lib/ non aiuta in questo caso (né dovrebbe essere realmente necessario per ogni utente sul sistema impostare tale variabile d'ambiente). Ho già eseguito update_dyld_shared_cache .

Il modulo Python in questione risiede in /opt/local/lib/python2.7/site-packages quindi ho creato un link simbolico ad esso in /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/ .

otool -L sui rapporti .so caricati:

otool -L /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/grgsm/_grgsm_swig.so

/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/grgsm/_grgsm_swig.so:
libgnuradio-grgsm.dylib (compatibility version 0.0.0, current version 0.0.0)
/opt/local/lib/libboost_filesystem-mt.dylib (compatibility version 0.0.0, current version 0.0.0)
/opt/local/lib/libboost_system-mt.dylib (compatibility version 0.0.0, current version 0.0.0)
/opt/local/lib/libboost_thread-mt.dylib (compatibility version 0.0.0, current version 0.0.0)
/opt/local/lib/libgnuradio-runtime.3.7.8.1.dylib (compatibility version 3.7.8, current version 0.0.0)
/opt/local/lib/libgnuradio-pmt.3.7.8.1.dylib (compatibility version 3.7.8, current version 0.0.0)
/opt/local/lib/libvolk.1.1.1.dylib (compatibility version 1.1.1, current version 0.0.0)
/usr/local/lib/libosmocore.7.dylib (compatibility version 8.0.0, current version 8.0.0)
/usr/local/lib/libosmogsm.5.dylib (compatibility version 7.0.0, current version 7.0.0)
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.1.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1225.1.1)

Si noti che la libreria in questione non ha un percorso.

    
posta watkipet 16.12.2015 - 23:03
fonte

1 risposta

1

Le biblioteche vengono di solito referenziate usando percorsi assoluti su OS X, rendendo superfluo impostare qualsiasi variabile. Il tuo output otool -L sul modulo Python dovrebbe quindi contenere

/opt/local/lib/libgnuradio-grgsm.$version.dylib (...)

Questo percorso viene copiato da ciò che Apple chiama "nome di identificazione della libreria condivisa" in una libreria quando ci si collega a esso. Ciò significa che qualunque valore è nell'output di otool -L sul modulo Python è lo stesso valore che si ottiene eseguendo otool -D su /opt/local/lib/libgnuradio-grgsm.dylib (o semplicemente usando otool -L e guardando la prima riga). Se lo fai sul tuo computer, noterai che anch'esso non contiene un percorso assoluto. Questa è la causa principale del problema che vedi.

Innanzitutto, si tratta di un bug nella GNU Radio o nella confezione di MacPorts di GNU Radio. Si prega di presentare un ticket in modo che questo possa essere risolto o risolto con gli sviluppatori di GNU Radio.

In secondo luogo, ci sono un paio di modi per ovviare a questo problema per ora:

  • Metodo A: corregge il nome di identificazione di libgnuradio-grgsm.dylib . Questo può essere fatto usando install_name_tool -id $correctID /opt/local/lib/libgnuradio-grgsm.dylib . Si noti che il percorso assoluto del dylib non verificato non è probabilmente il valore corretto per questo. libgnuradio-grgsm.dylib è probabilmente un collegamento simbolico a un altro link simbolico con la versione principale incorporata. Questo percorso è quello che dovrebbe essere usato come nome di installazione. Dopo questa modifica, la ricostruzione del modulo Python dovrebbe risolvere il problema.

  • Metodo B: corregge il percorso nel comando load del modulo Python. Usa install_name_tool -change libgnuradio-grgsm.dylib $correctID /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/grgsm/_grgsm_swig.so per fare questo. $correctID deve essere scelto come spiegato nel Metodo A.

risposta data 17.12.2015 - 19:09
fonte

Leggi altre domande sui tag