Ich möchte eine meiner C ++ - Klassen als Python-Modul verfügbar machen. Die Klasse wird in einer Kopfzeile Foo.h
deklariert und in einer .cpp Foo.cpp
implementiert.
(g ++ - 4.5, Ubuntu x86_64). Es ist eine sehr einfache Klasse:
Foo.cpp
:
Foo.h
:
Ich habe ein setup.py
erstellt, wie im Cython-Tutorial gezeigt:
setup.py
und folgte der Anweisung des Cython-Tutorials, um mein Foo.pyx
Cython-Modul zu schreiben:
Foo.pyx
Ich kompiliere es mit dem folgenden Befehl:
python setup.py build_ext --inplace
Jetzt wird das gemeinsam genutzte Bibliotheksobjekt Foo.so
erstellt, aber wenn ich es aus Python importieren möchte, bekomme ich:
Ich denke, dass _ZN4FooD1Ev der Name des Konstruktors von Foo
ist, aber nicht versteht, wie das Symbol fehlt.
Ich kann wirklich nicht verstehen, welches Symbol in der gemeinsamen Objektdatei fehlt.
Und als zweiter Punkt, nach dem python setup.py build_ext --inplace
-Befehl, ist meine Foo.cpp
-Datei durcheinander und enthält die cythonisierte Version.
Wie ist es möglich, die cythonisierte Datei in einem anderen Format umzubenennen (zum Beispiel .cxx
) und diesen Linker-Fehler zu vermeiden?
Ich habe dann die Foo.pyx
in pFoo.pyx
geändert und folglich die setup.py
geändert, jetzt nach dem Setup-Befehl habe ich die cythonisierte Version von pFoo.pyx
in Foo.cxx
, aber wenn ich versuche zu importieren, bekomme ich
ImportError: dynamic module does not define init function (initpyFoo)
Was ist falsch an meinem Setup und wie kann ich meine Probleme lösen?
Ich schlage vor, dass Sie einen anderen Namen für Ihr Cython-Modul verwenden, z. cFoo, um das Kollisionsproblem zu vermeiden:
%Vor%Um eine C ++ - Klasse zu definieren, verwenden Sie das Schlüsselwort 'cppclass' wie folgt:
%Vor%Sie sollten dann wie folgt auf Ihre Klasse zugreifen können:
%Vor%Tags und Links python distutils cython undefined-reference