Die Verpackung einer C++ - Klasse in Python mit SCHLUCK
Beispiel.h:
#ifndef EXAMPLE_H
#define EXAMPLE_H
class Math {
public:
int pi() const;
void pi(int pi);
private:
int _pi;
};
#endif
example.cpp:
#include "example.h"
int Math::pi() const {
return this->_pi;
}
void Math::pi(int pi) {
this->_pi = pi;
}
Beispiel.Schluck:
%module example
%{
#define SWIG_FILE_WITH_INIT
#include "example.h"
%}
%include "example.h"
Ich dann generieren der Wrapper, "example.py" und "example_wrap.c - " mit:
swig -python example.swig
Wenn ich versuche zu kompilieren, die wrapper-Klasse mit:
g++ -fPIC -c example.cpp example_wrap.c -I/usr/local/include/python2.6/
Bekomme ich die folgende Fehlermeldung:
example_wrap.cpp: In function "PyObject* Swig_var_Math_get()":
example_wrap.cpp:2725: error: expected primary-expression before "void"
example_wrap.cpp:2725: error: expected ")" before "void"
Den Fehler in der folgenden Zeile :
pyobj = SWIG_NewPointerObj(SWIG_as_voidptr(&Math), SWIGTYPE_p_class, 0 );
#define SWIG_as_voidptr(a) (void *)((const void *)(a))
Ist es der richtige Weg zum generieren der wrapper-Klasse "example_wrap.c"?
Du hast ziemlich schlimme Probleme mit der Formatierung.
Nicht so schlecht, Sie wusste einfach nicht, der Einzug der gesamte code, der vier Räume. Behoben.
Nicht so schlecht, Sie wusste einfach nicht, der Einzug der gesamte code, der vier Räume. Behoben.
InformationsquelleAutor Ajay | 2011-01-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, die Schluck-Befehl sollte "swig -c++ -python-Beispiel.Schluck"
InformationsquelleAutor Chris Card
Gibt es nicht genug Informationen, um sicher zu sein, was falsch ist, aber ich habe zwei Ideen für Dinge, die Sie ausprobieren können.
Ihre
g++
Aufruf ist das kompilieren eines C-Quell-Datei, als ob es C++. Dies ist nicht garantiert, um zu arbeiten. Versuchen Sie stattdessen(ja, srsly, nur mit g++ für den link)
Wenn das nicht funktioniert, kompilieren
example_wrap.c
wie diese:Dass werden nicht die gleiche Weise, sondern erzeugt eine Datei mit dem Namen
example_wrap.i
die das Ergebnis der preprocesing. Es wird gigantisch. Suche diese Datei für die FunktionSwig_var_Math_get
, und fügen Sie zu Ihrer Frage der vollständigen text der Funktion (aber sonst nichts).Es ist nur notwendig, um
g++
link.gcc -c
macht das Richtige, wenn Sie angewendet werden, um eine.cpp
source-Datei. Aberg++ -c
nicht das Richtige tun, wenn angewandt, um eine.c
source-Datei. Also, die einfachste Regel zu erinnern ist, verwenden Sie immergcc
zu kompilieren, auch wenn die Quelle ist C++; nur Nutzungg++
link ein Programm mit C++. Gleich für die anderen Sprachen, unterstützt durch GCC: verwenden Sie das language-spezifische Treiber nur den link. Ich persönlich glaube nicht, dass die Sprache-spezifische Treiber sollten auch existieren, aber Sie tun, lassen Sie Sie nicht genau wissen, wie aufrufen, für die runtime-Bibliotheken.gut, ja, können Sie gcc zum kompilieren von C++. Sie können auch gcc link C++, aber man müsste manuell den link gegen die libstdc++, usw.. Setzen, die Art und Weise finde ich einfacher zu bedienen gcc für C und g++ für C++. Aber es ist nur der persönliche Geschmack. Das wichtige ist, dass problem & Lösung wurden korrekt hingewiesen. +1
InformationsquelleAutor zwol
Danke für dein replay!
- C++ - option generiert die C++ - Klasse für den wrapper.
swig -c++ -v -python-Beispiel.Schluck
Ich benutzt g++ zum kompilieren der wrapper.
Und den folgenden Befehl aus, um buikd das gemeinsame Objekt. Natürlich, wir müssen entfernen, die überflüssig wurde, umfasst (-I) und libraries (-L). Die wichtigsten flags sind 'freigegeben' und '-fPIC'.
InformationsquelleAutor Ajay