Ho preso una libreria che è distribuita come una lib di binario (.a) e un'intestazione, scritto un codice C++ contro di essa, e voglio avvolgere i risultati in un python modulo.estensione python c, problemi con dlopen su mac os
Ho fatto questo here.
Il problema è che durante l'importazione di questo modulo su Mac OSX (ho provato 10.5 e 10.6), ottengo il seguente errore:
dlopen(/Library/Python/2.5/site-packages/dirac.so, 2): Symbol not found: _DisposePtr
Referenced from: /Library/Python/2.5/site-packages/dirac.so
Expected in: dynamic lookup
Questo appare come simboli definiti nel quadro di carbonio non sono essere correttamente risolti, ma non sono sicuro di cosa fare al riguardo. Sto fornendo il parametro -framework Carbon
a distutil.core.Extension
extra_link_args
, quindi non sono sicuro di cos'altro dovrei fare.
Qualsiasi aiuto sarebbe molto apprezzato.
Aggiornamento:
La linea di compilazione generato da setup.py assomiglia a questo:
gcc -fno-strict-aliasing -Wno-long-double -no-cpp-precomp -mno-fused-madd -fno-common -dynamic -DNDEBUG -g -Os -Wall -Wstrict-prototypes -DMACOSX -I/usr/include/ffi -DENABLE_DTRACE -arch i386 -arch ppc -pipe -Isource -I/System/Library/Frameworks/Python.framework/Versions/2.5/Extras/lib/python/numpy/core/include -I/System/Library/Frameworks/Python.framework/Versions/2.5/Extras/lib/python/numpy/numarray -I/usr/lib/python/2.5/site-packages/numpy/numarray/numpy -I/usr/lib/python/2.5/site-packages/numpy/numarray -I/usr/lib/python/2.5/site-packages/numpy/core/include -I/System/Library/Frameworks/Python.framework/Versions/2.5/include/python2.5 -c source/Dirac_LE.cpp -o build/temp.macosx-10.5-i386-2.5/source/Dirac_LE.o
La linea linker è simile al seguente:
g++ -Wl,-F. -bundle -undefined dynamic_lookup -arch i386 -arch ppc build/temp.macosx-10.5-i386-2.5/diracmodule.o build/temp.macosx-10.5-i386-2.5/source/Dirac_LE.o -Llibs/MacOSX -lDiracLE -o build/lib.macosx-10.5-i386-2.5/dirac.so -framework Carbon
otool
rapporti:
dirac.so:
/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.4.0)
/usr/lib/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 111.1.5)
Update 2: su MacOS 10.5, modificando le bandiere dlopen dal valore predefinito di RTLD_NOW
al RTLD_LAZY
risolve il problema. Tuttavia, questo non funziona su Mac OS 10.6.
Sulla 10.6, la seguente sequenza permette la libreria per funzionare correttamente, anche se non sono sicuro del perché:
- python setup.py costruire -v
- eseguire la riga linker (stampate a consolare da setup.py) di nuovo, manualmente.
- python setup.py install
Sto ancora cercando una buona risposta su come farlo funzionare correttamente. Grazie!
Qual è il compilatore vero e proprio linea di comando che setup.py esegue? Elimina la directory 'build' ed esegui' setup.py build -v' per vedere. Inoltre, cosa dice 'otool -L' sul file' dirac.so'? –
@Thomas, ho aggiornato la domanda con quell'informazione, grazie. –
Che va bene allora; l'argomento -framework si trova nel posto proibito.L'unica cosa che posso immaginare è che hai bisogno di un framework diverso, o che il framework dovrebbe introdurre una dipendenza shlib e in qualche modo non lo è (non so se il framework Carbon dovrebbe farlo o meno). –