2010-05-07 22 views
9

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.Extensionextra_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é:

  1. python setup.py costruire -v
  2. eseguire la riga linker (stampate a consolare da setup.py) di nuovo, manualmente.
  3. python setup.py install

Sto ancora cercando una buona risposta su come farlo funzionare correttamente. Grazie!

+1

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'? –

+0

@Thomas, ho aggiornato la domanda con quell'informazione, grazie. –

+0

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). –

risposta

4

Stai per calciare te stesso quando vedi la risposta a questo! Provare a cambiare questo:

link_args = ['-framework Carbon'] if platform == 'Darwin' else [] 

a questo:

link_args = ['-framework', 'Carbon'] if platform == 'Darwin' else [] 

Una volta che ho fatto questo cambiamento sono stato in grado di fare una generazione pulita e importare il modulo subito :)

+0

Incredibile. Grazie! –