Undefinierter Symbolfehler beim Importieren des Cython-Moduls

8

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 :

%Vor%

Foo.h :

%Vor%

Ich habe ein setup.py erstellt, wie im Cython-Tutorial gezeigt:

setup.py

%Vor%

und folgte der Anweisung des Cython-Tutorials, um mein Foo.pyx Cython-Modul zu schreiben:

Foo.pyx

%Vor%

Ich kompiliere es mit dem folgenden Befehl: python setup.py build_ext --inplace

%Vor%

Jetzt wird das gemeinsam genutzte Bibliotheksobjekt Foo.so erstellt, aber wenn ich es aus Python importieren möchte, bekomme ich:

%Vor%

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?

    
linello 23.10.2012, 08:40
quelle

1 Antwort

2

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%     
Snorfalorpagus 20.12.2012, 17:40
quelle