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:
- Python bauen setup.py -v
- die Linker Zeile (gedruckt durch zu trösten setup.py) erneut, manuell.
- python setup.py install
ich für eine gute Antwort noch bin auf der Suche, wie diese richtig zu funktionieren zu bekommen. Vielen Dank!
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? –
@Thomas, Ich habe die Frage mit dieser Information aktualisiert, danke. –
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). –