2010-05-07 5 views
9

Ich habe eine Bibliothek, die als binäre Lib (.a) und Header verteilt ist, geschrieben einige C++ - Code dagegen, und möchten die Ergebnisse in einem Python zu wickeln Modul.Python C-Erweiterung, Probleme mit dlopen auf Mac OS

Ich habe dies getan here.

Das Problem ist, dass, wenn dieses Modul auf Mac OSX Import (Ich habe 10.5 und 10.6 versucht), erhalte ich folgende Fehlermeldung:

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 

Die gleiche Symbol sieht im Carbon-Rahmen definiert sind nicht richtig gelöst werden, aber ich bin mir nicht sicher, was ich dagegen tun soll. Ich liefere -framework Carbon zu distutil.core.Extension 's extra_link_args Parameter, also bin ich nicht sicher, was ich sonst tun sollte.

Jede Hilfe würde sehr geschätzt werden.

Update:

Die Kompilierung Linie erzeugt durch setup.py wie folgt aussieht:

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 

Der Linker Linie sieht wie folgt aus:

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 Berichte:

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: auf MacOS 10.5, von dem Standard von RTLD_NOW zu RTLD_LAZY den dlopen Flags modifiziert löst das Problem. Dies funktioniert jedoch nicht unter Mac OS 10.6.

auf 10,6, die folgende Sequenz die Bibliothek erlaubt es ordnungsgemäß ausgeführt werden, obwohl ich nicht sicher bin, warum:

  1. Python bauen setup.py -v
  2. die Linker Zeile (gedruckt durch zu trösten setup.py) erneut, manuell.
  3. python setup.py install

ich für eine gute Antwort noch bin auf der Suche, wie diese richtig zu funktionieren zu bekommen. Vielen Dank!

+1

Was ist der eigentliche Compiler Befehlszeile, die setup.py ausführt? Löschen Sie das Verzeichnis 'build' und führen Sie' setup.py build -v' aus, um zu sehen. Und was sagt "Otool -L" über die 'dirac.so' Datei? –

+0

@Thomas, Ich habe die Frage mit dieser Information aktualisiert, danke. –

+0

Das sieht dann gut aus; Das Argument -framework befindet sich an der verbotenen Stelle.Die einzigen Dinge, die ich mir vorstellen kann ist, dass Sie ein anderes Framework benötigen, oder dass das Framework eine shlib-Abhängigkeit einführen soll und irgendwie nicht (ich weiß nicht, ob das Carbon-Framework das tun soll oder nicht). –

Antwort

4

Sie werden sich selbst treten, wenn Sie die Antwort darauf sehen! Versuchen Sie, dieses:

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

dazu:

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

Sobald ich diese Änderung vorgenommen konnte ich einen bereinigter Build tun, und importieren Sie das Modul sofort :)

+0

Unglaublich. Vielen Dank! –