Erstelltes C Modul funktioniert nicht

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Martin89
User
Beiträge: 22
Registriert: Freitag 12. Mai 2006, 21:03
Wohnort: /home/

Freitag 12. Mai 2006, 21:09

Hallo!

Ich habe folgenden Code geschrieben um ein C Objekt fuer Python nutzbar zu machen sry ist etwas lang:

Code: Alles auswählen

typedef struct RoomInfoObject
{
	PyObject_HEAD
	int       ID;
	PyObject* name;
	int       src;
	PyObject* srcname;
	PyObject* descr;
	int       colf;
	int       texf;
} RoomInfoObject;

static PyMemberDef RoomInfo_members[] = {
    {"ID",   T_INT, offsetof(RoomInfoObject, ID),   0, "ID of the room"},
    {"src",  T_INT, offsetof(RoomInfoObject, src),  0, "src of the room"},
    {"colf", T_INT, offsetof(RoomInfoObject, colf), 0, ""},
    {"texf", T_INT, offsetof(RoomInfoObject, texf), 0, ""},
    {NULL}  /* Sentinel */
};

static void RoomInfo_dealloc(RoomInfoObject* self)
{
    Py_XDECREF(self->name);
    Py_XDECREF(self->srcname);
    Py_XDECREF(self->descr);
    self->ob_type->tp_free((PyObject*)self);
}

static PyObject* RoomInfo_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{
	RoomInfoObject* self;
	
	self= (RoomInfoObject *)type->tp_alloc(type, 0);
	if (self != NULL)
	{
		self->name= PyString_FromString("");
		if( self->name == NULL )
		{
			Py_DECREF( self );
			return NULL ;
		}
		
		self->srcname= PyString_FromString("");
		if( self->srcname == NULL )
		{
			Py_DECREF( self );
			return NULL ;
		}
		
		self->descr= PyString_FromString("");
		if( self->descr == NULL )
		{
			Py_DECREF( self );
			return NULL ;
		}
		
		self->ID= 0;
		self->src= 0;
		self->colf= 0;
		self->texf= 0;
	}
	
	return (PyObject *)self;
}


static int RoomInfo_init(RoomInfoObject* self, PyObject *args, PyObject *kwds)
{
	PyObject *name=NULL, *srcname=NULL, *descr= NULL, *tmp;
	
	//printf("asdf\n");
	static char *kwlist[] = {"ID", "name", "src", "srcname" "descr", 
		"colf", "texf", NULL};
	
	if (! PyArg_ParseTupleAndKeywords(args, kwds, "|iSiSSii", kwlist, 
                                      &self->ID,
																			&name,
																			&self->src,
																			&srcname,
																			&descr,
																			&self->colf,
                                      &self->texf))
		return -1;
	
	printf("asdf\n");
	if( name )
	{
		tmp= self->name;
		Py_INCREF( name );
		self->name= name;
		Py_DECREF( tmp );
	}
	
	if( srcname )
	{
		tmp= self->srcname;
		Py_INCREF( srcname );
		self->srcname= srcname;
		Py_DECREF(tmp);
	}
	
	if( descr )
	{
		tmp= self->descr;
		Py_INCREF( descr );
		self->descr= descr;
		Py_DECREF(tmp);
	}
	
	return 0;
}


static int       _RoomInfo_name_set(RoomInfoObject* self, PyObject* value, void* closure);
static PyObject* _RoomInfo_name_get(RoomInfoObject* self, void* closure);
static int       _RoomInfo_srcname_set(RoomInfoObject* self, PyObject* value, void* closure);
static PyObject* _RoomInfo_srcname_get(RoomInfoObject* self, void* closure);
static int       _RoomInfo_descr_set(RoomInfoObject* self, PyObject* value, void* closure);
static PyObject* _RoomInfo_descr_get(RoomInfoObject* self, void* closure);

static PyGetSetDef RoomInfo_getseters[]= {
    {"name", (getter)_RoomInfo_name_get, (setter)_RoomInfo_name_set, NULL},
    {"srcname", (getter)_RoomInfo_srcname_get, (setter)_RoomInfo_srcname_set, NULL},
    {"descr", (getter)_RoomInfo_descr_get, (setter)_RoomInfo_descr_set, NULL},
    {NULL}  /* Sentinel */
};

static int _RoomInfo_name_set(RoomInfoObject* self, PyObject* value, void* closure)
{
	if( value == NULL )
	{
		PyErr_SetString(PyExc_TypeError, "Cannot delete the 'name' attribute");
		return -1;
	}
  
	if( !PyString_Check(value) )
	{
		PyErr_SetString(PyExc_TypeError,
			"The first attribute value must be a string");
		return -1;
	}
	
	Py_DECREF( self->name );
  Py_INCREF(value);
  self->name= value;    
	
  return 0;
}

static PyObject* _RoomInfo_name_get(RoomInfoObject* self, void* closure)
{
	Py_INCREF(self->name);
  return self->name;
}

static int _RoomInfo_srcname_set(RoomInfoObject* self, PyObject* value, void* closure)
{
	if( value == NULL )
	{
		PyErr_SetString(PyExc_TypeError, "Cannot delete the 'name' attribute");
		return -1;
	}
  
	if( !PyString_Check(value) )
	{
		PyErr_SetString(PyExc_TypeError,
			"The first attribute value must be a string");
		return -1;
	}
	
	Py_DECREF(self->srcname);
  Py_INCREF(value);
  self->srcname= value;    
	
  return 0;
}

static PyObject* _RoomInfo_srcname_get(RoomInfoObject* self, void* closure)
{
	Py_INCREF(self->srcname);
  return self->srcname;
}

static int _RoomInfo_descr_set(RoomInfoObject* self, PyObject* value, void* closure)
{
	if( value == NULL )
	{
		PyErr_SetString(PyExc_TypeError, "Cannot delete the 'name' attribute");
		return -1;
	}
  
	if( !PyString_Check(value) )
	{
		PyErr_SetString(PyExc_TypeError,
			"The first attribute value must be a string");
		return -1;
	}
	
	Py_DECREF(self->descr);
  Py_INCREF(value);
  self->descr= value;
	
  return 0;
}

static PyObject* _RoomInfo_descr_get(RoomInfoObject* self, void* closure)
{
	Py_INCREF( self->descr );
	return self->descr ;
}

static PyTypeObject RoomInfoType = {
    PyObject_HEAD_INIT(NULL)
    0,                         /*ob_size*/
    "RoomInfo",   /*tp_name*/
    sizeof(RoomInfoObject),    /*tp_basicsize*/
    0,                         /*tp_itemsize*/
    (destructor)RoomInfo_dealloc, /*tp_dealloc*/
    0,                         /*tp_print*/
    0,                         /*tp_getattr*/
    0,                         /*tp_setattr*/
    0,                         /*tp_compare*/
    0,                         /*tp_repr*/
    0,                         /*tp_as_number*/
    0,                         /*tp_as_sequence*/
    0,                         /*tp_as_mapping*/
    0,                         /*tp_hash */
    0,                         /*tp_call*/
    0,                         /*tp_str*/
    0,                         /*tp_getattro*/
    0,                         /*tp_setattro*/
    0,                         /*tp_as_buffer*/
    Py_TPFLAGS_DEFAULT, /*tp_flags*/
    "RoomInfo object",   /* tp_doc */
    0,		               /* tp_traverse */
    0,		               /* tp_clear */
    0,		               /* tp_richcompare */
    0,		               /* tp_weaklistoffset */
    0,		               /* tp_iter */
    0,		               /* tp_iternext */
    0,                   /* tp_methods */
    RoomInfo_members,    /* tp_members */
    RoomInfo_getseters,  /* tp_getset */
    0,                         /* tp_base */
    0,                         /* tp_dict */
    0,                         /* tp_descr_get */
    0,                         /* tp_descr_set */
    0,                         /* tp_dictoffset */
    (initproc)RoomInfo_init,   /* tp_init */
    0,                         /* tp_alloc */
    RoomInfo_new,              /* tp_new */
};
In der Init funktion:

Code: Alles auswählen

Py_INCREF(&RoomInfoType);
PyModule_AddObject(m, "RoomInfo",     (PyObject *)&RoomInfoType);
Wenn ich versuche auf das Objekt zuzugreifen stuerzt Python mit einem Segmentation fault ab
Core dump

Code: Alles auswählen

Exception: STATUS_ACCESS_VIOLATION at eip=6A870FED
eax=00000000 ebx=712C9000 ecx=00000889 edx=FFFFFFFF esi=610E3038 edi=00000000
ebp=0022EB78 esp=0022EB50 program=D:\cygwin\bin\python2.4.exe, pid 3972, thread main
cs=001B ds=0023 es=0023 fs=003B gs=0000 ss=0023
Stack trace:
Frame     Function  Args
0022EB78  6A870FED  (712C9000, 610E3038, 00000000, 00000000)
0022EB98  6A871135  (712C9000, 610E3038, 00000000, 6A8A499B)
0022EBC8  6A858AD3  (712C9000, 0046E068, 00000000, 004DC36C)
0022EBE8  6A8D5B34  (00000000, 712C9000, 004DA8B8, 004DA8B8)
0022EC18  6A87023A  (0046BBEC, 004DC36C, 00000000, 6A86E2CE)
0022EC38  6A84A189  (0046BBEC, 004DC36C, 00000000, 712C9000)
0022EC58  6A8A4A77  (0046BBEC, 004DC36C, 00000000, 6A841840)
0022ED08  6A8A1F61  (00519AB4, 00495C60, 00478824, 00478824)
0022ED88  6A8A384E  (00495C60, 00478824, 00478824, 00000000)
0022EDB8  6A8A0DC9  (00495C60, 00478824, 00478824, 00000001)
0022EDD8  6A8D37EB  (00461470, 6A92CB22, 00478824, 00478824)
0022EE48  6A8D29AE  (610E2FD0, 6A92CB22, 0022EEF4, 6A8D3FC2)
0022EE78  6A8D2773  (610E2FD0, 6A92CB22, 0022EEF4, 00000000)
0022EEA8  6A8D26C2  (610E2FD0, 6A92CB22, 00000000, 0022EEF4)
0022EF08  6A8DA0B1  (00000000, 611576C0, 0022EFD8, 61004DD2)
0022EF18  00401087  (00000001, 611576C0, 00460090, 7C929AF0)
End of stack trace (more stack frames may be present)
Ich verwende Cygwin mit Python 2.4 auf Windows XP

Danke Martin
Benutzeravatar
Toni83
User
Beiträge: 125
Registriert: Donnerstag 28. Juli 2005, 10:53

Samstag 13. Mai 2006, 11:21

Servus,

versuche mal deinen C-Source in eine dll zu packen (z.B. mit VC ganz gut machbar), diese ist dann von jeder beliebigen Programmiersprache zugreifbar. In Python geht das mit ctypes ganz gut. (Habe feststellen müssen, dass dies der vielleicht einfachste Weg ist.)
Falls erwünscht schreibe ich hier eine kleine Anleitung wie dies geht.

Gruss,
Toni
Martin89
User
Beiträge: 22
Registriert: Freitag 12. Mai 2006, 21:03
Wohnort: /home/

Samstag 13. Mai 2006, 11:44

Ok danke!

Das Problem konnte ich schon beheben. In der Init funktion war ein fehler.
Was ich wirklich brauche ist ein Tool mit dem ich eine Cpp Klasse fuer Python nutzbar machen kann. Die Methoden geben teilweise Strukturen zurueck.
Ich habe es schon mit SWIG probiert aber SWIG definiert die init funktion falsch und erstellt mir keinen Code um die Klasse nutzbar zu machen.
Weis irgendjemand was ich noch probieren kann?
danke Martin
marcel
User
Beiträge: 1
Registriert: Freitag 12. Mai 2006, 07:28

Samstag 13. Mai 2006, 11:52

Habe mich noch nie damit befasst, aber es gibt eine C++-Library, die sich "boost" schimpft, und die soll so etwas können, habe ich mir sagen lassen...
Benutzeravatar
Toni83
User
Beiträge: 125
Registriert: Donnerstag 28. Juli 2005, 10:53

Samstag 13. Mai 2006, 11:53

Pyrex wäre da auch nochmal eine Möglichkeit.
Generell ist das mit dem wrappen meiner Ansicht nach eine Glückssache.
Das eine mal funktionierts, dass andere mal nicht...
Du kannst doch auch mit z.B. VC++ 6.0 eine dll erstellen ist alles kein Problem (Der Aufwand ist im nachhinein kleiner als wen du dich in das wrappen neiflashen würdest).

Gruss,
Toni
Martin89
User
Beiträge: 22
Registriert: Freitag 12. Mai 2006, 21:03
Wohnort: /home/

Samstag 13. Mai 2006, 12:37

Danke fuer die schnelle Hilfe!
Ich habe mir Pyrex runtergeladen und installiert. Das Tool scheint wirklich sehr gut zu sein.
Beim Ausprobieren stosze ich aber beim Erstellen eines Modlues wie es in der section "Building Your Module Using distutils" beschrieben steht auf einen Fehler

Code: Alles auswählen

# Create the C file
os.system("python pyrexc mymodule.pyx")
Fehler:

Code: Alles auswählen

python2.4: can't open file 'pyrexc': [Errno 2] No such file or directory
Was habe ich falsch gemacht bzw was muss ich anders machen

Danke Martin
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Samstag 13. Mai 2006, 12:54

Toni83 hat geschrieben:Du kannst doch auch mit z.B. VC++ 6.0 eine dll erstellen ist alles kein Problem (Der Aufwand ist im nachhinein kleiner als wen du dich in das wrappen neiflashen würdest).
Hat allerdings mehrere Nachteile:
  1. ctypes wird benötigt (relativiert sich mit Python 2.5 etwas)
  2. generiert keine schönen Funktionssignaturen die man per dir() ansehen kann -> weniger Introspection (mit 0.9.5 wurde etwas angefangen, was Wrapper erstellt)
  3. dynamisch durch den ctypes Wrapper ausgeführt, deswegen etwas langsamer als direkte C-Module
  4. nur für C verwendbar
Davon mal abgesehen kann man die generation von DLLs nicht so schön in die distutils einbinden. Denn mit denen stelle ich einfach nur den Compiler ein (in meienm Fall MinGW), rufe die distutils auf und schon bin ich (bzw. jemand der er kompilieren will/muss) fertig.
Martin89 hat geschrieben:Fehler:

Code: Alles auswählen

python2.4: can't open file 'pyrexc': [Errno 2] No such file or directory
Was habe ich falsch gemacht bzw was muss ich anders machen
Du musst die Datei pyrexc, die im Pyrex-Tarball unter bin/ ist, bei dir irgendwo in den $PATH stellen und ausführbar machen. Alternativ kannst du die Datei auch manuell aufrufen, sie generiert aus dem Pyrex-Pseudo-Python einen Quellcode, den du dann von Hand kompilieren kannst.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Martin89
User
Beiträge: 22
Registriert: Freitag 12. Mai 2006, 21:03
Wohnort: /home/

Samstag 13. Mai 2006, 13:54

Ok jetzt geths.
Das naechste Problem: Die DLL wird erstellt aber ich kann die definierte Struktur nicht finden
ServerHandle.pyx

Code: Alles auswählen

cdef struct RoomInfo:
	int   ID
	char* name
	int   src
	char* srcname
	char* descr
	int   colf
	int   texf
setup.py

Code: Alles auswählen

from distutils.core import setup, Extension
import os

# Create the C file
os.system("python2.4 pyrexc ServerHandle.pyx")

# Make the extension module
Extn = Extension("ServerHandle", ["ServerHandle.c"])

# Compile the extension module
setup(name="ServerHandle", ext_modules=[Extn])
Danke Martin

Edit (Leonidas): BBCode Markup geändert.
Benutzeravatar
Toni83
User
Beiträge: 125
Registriert: Donnerstag 28. Juli 2005, 10:53

Samstag 13. Mai 2006, 16:01

Leonidas hat geschrieben: Hat allerdings mehrere Nachteile:
  1. ctypes wird benötigt (relativiert sich mit Python 2.5 etwas)
  2. generiert keine schönen Funktionssignaturen die man per dir() ansehen kann -> weniger Introspection (mit 0.9.5 wurde etwas angefangen, was Wrapper erstellt)
  3. dynamisch durch den ctypes Wrapper ausgeführt, deswegen etwas langsamer als direkte C-Module
  4. nur für C verwendbar
Davon mal abgesehen kann man die generation von DLLs nicht so schön in die distutils einbinden. Denn mit denen stelle ich einfach nur den Compiler ein (in meienm Fall MinGW), rufe die distutils auf und schon bin ich (bzw. jemand der er kompilieren will/muss) fertig.
Wenn das so einfach mit dem wrappen ist, kannst du mir sagen woran es hier gehapert hat: (WRAPPEN UNTER WINDOWS)
http://www.python-forum.de/topic-5597,30.html
Werde meine Meinung übers wrappen gerne umändern (Ist ernst gemeint).

Gruss,
Toni
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Samstag 13. Mai 2006, 16:31

Toni83 hat geschrieben:Wenn das so einfach mit dem wrappen ist
Habe ich nicht behauptet. Ich habe nur die Nachteile von ctypes aufgezählt, die es nun ganz einfach mal hat. Das es auch Vorteile wie die Einfachkeit hat, ist Unbestritten.
Toni83 hat geschrieben:kannst du mir sagen woran es hier gehapert hat
Ich tippe darauf, dass NI-DAQ nicht frei verfügbar ist und somit kaum jemand es selbst testen konnte.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Martin89
User
Beiträge: 22
Registriert: Freitag 12. Mai 2006, 21:03
Wohnort: /home/

Samstag 13. Mai 2006, 17:33

Ich hab was neues probiert:
Die .pyx

Code: Alles auswählen

cdef extern from "ServerHandle.h":
  cdef extern struct RoomInfo
die setup.py

Code: Alles auswählen

from distutils.core import setup, Extension
import os

# Create the C file
os.system("python2.4 pyrexc ServerHandle.pyx")

# Make the extension module
Extn = Extension("ServerHandle", ["ServerHandle.c", "ServerHandle.cpp"])

# Compile the extension module
setup(name="ServerHandle", ext_modules=[Extn])
Jetzt ist nur das Problem, dass er das ganze mit dem gcc kompiliert und der sich ueber meine ServerHandle.cpp beschwert weil er ja kein C++ kann.
Wie kann ich diesen Fehler beheben?
Danke Martin
Martin89
User
Beiträge: 22
Registriert: Freitag 12. Mai 2006, 21:03
Wohnort: /home/

Sonntag 14. Mai 2006, 16:35

Ich habe eine ganz große Bitte an alle Python gurus:
Kann mir irgendjemand helfen, dass ich eine C++ Klasse in Python verwenden kann.
ServerHandle.cpp
ServerHandle.h

Danke Martin
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Sonntag 14. Mai 2006, 18:08

Martin89 hat geschrieben:Kann mir irgendjemand helfen, dass ich eine C++ Klasse in Python verwenden kann.
Ich habe gerade noch pyrexembed gefunden, welches C++ mit Pyrex erlaubt. Damit kannst du es probieren. Ich probiere es auch mal, wenn ich Zeit finde.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Martin89
User
Beiträge: 22
Registriert: Freitag 12. Mai 2006, 21:03
Wohnort: /home/

Sonntag 14. Mai 2006, 20:34

O mann muss ich euch auf die nerven gehen...
Ich habe jetzt angefangen es mit dem neuen tool zu probieren

Die setup.py

Code: Alles auswählen

from distutils.core import setup, Extension
import os

# Create the _embeded C file
os.system("python pyrexembed ServerHandle.pyxe")
# Create the C file
os.system("python pyrexc ServerHandle.pyx")
# Make the extension module
Extn = Extension("ServerHandle", ["ServerHandle.c", "ServerHandle.cpp", "../MD5.cpp"])
# Compile the extension module
setup(name="ServerHandle", ext_modules=[Extn])
ServerHandle.pyxe

Code: Alles auswählen

#header{
#include "ServerHandle.h"
#}header

cdef class ServerHandle:
	cdef void *thisptr #the this pointer for the class
	
	def __init__(self):
		# create constructor shim func
		#embed{ void *ServerHandle_init()
			return (void *)(new ServerHandle());
		#}embed
		self.thisptr = ServerHandle_init()
	
	def connect(self, host, port)
		#embed{ int ServerHandle_connect(void *obj, char* addr, int port)
			return ( (ServerHandle* ) obj )->connect( addr, port );
		#}embed
		return ServerHandle_connect( self.thisptr, addr, port )
Das geniert mir die ServerHandle.pyx

Code: Alles auswählen

# **************************************************************
# Generated by pyrexembed from ServerHandle.pyxe.pyxe
# Please do not edit
# **************************************************************

cdef extern from "ServerHandle_embed.h":
    cdef void *ServerHandle_init()
    cdef int ServerHandle_connect(void *obj, char* addr, int port)


cdef class ServerHandle:
	cdef void *thisptr #the this pointer for the class
	
	def __init__(self):
		# create constructor shim func
		
		self.thisptr = ServerHandle_init()
	
	def connect(self, host, port)
		
		return ServerHandle_connect( self.thisptr, addr, port )
Das setup skript gibt mir folgende Fehler meldung aus:

Code: Alles auswählen

/cygdrive/e/Programmieren/ServerHandle/ServerHandle.pyx:12:0: Mixed use of tabs and spaces
Martin89
User
Beiträge: 22
Registriert: Freitag 12. Mai 2006, 21:03
Wohnort: /home/

Montag 15. Mai 2006, 09:47

Hallo den fehler konnte ich beheben:
In der datei pyrexembed.py

Code: Alles auswählen

        # now process all the shim functions
        for dec, body in self.embedFuncs:
            # add the pyrex import
            pyrexShimDecs.append("[b]\t[/b]cdef "+dec) #vorher '    cdef'
Wenn ich jetzt das skript laufen lasse spuckt der Compiler beim letzten schritt folgende Fehlermeldungen aus:

Code: Alles auswählen

c++ -shared -Wl,--enable-auto-image-base build/temp.cygwin-1.5.18-i686-2.4/Serve
rHandle.o build/temp.cygwin-1.5.18-i686-2.4/ServerHandle.o build/temp.cygwin-1.5
.18-i686-2.4/../MD5.o -L/usr/lib/python2.4/config -lpython2.4 -o build/lib.cygwi
n-1.5.18-i686-2.4/ServerHandle.dll
build/temp.cygwin-1.5.18-i686-2.4/ServerHandle.o: In function `initServerHandle'
:
/cygdrive/e/Programmieren/Spiele/VirtualWorld/ServerHandle/pyrex/ServerHandle.c:
272: multiple definition of `_initServerHandle'
build/temp.cygwin-1.5.18-i686-2.4/ServerHandle.o:/cygdrive/e/Programmieren/Spiel
e/VirtualWorld/ServerHandle/pyrex/ServerHandle.c:272: first defined here
build/temp.cygwin-1.5.18-i686-2.4/ServerHandle.o: In function `__pyx_tp_new_12Se
rverHandle_ServerHandle':
/cygdrive/e/Programmieren/Spiele/VirtualWorld/ServerHandle/pyrex/ServerHandle.c:
122: multiple definition of `___pyx_type_12ServerHandle_ServerHandle'
build/temp.cygwin-1.5.18-i686-2.4/ServerHandle.o:/cygdrive/e/Programmieren/Spiel
e/VirtualWorld/ServerHandle/pyrex/ServerHandle.c:122: first defined here
build/temp.cygwin-1.5.18-i686-2.4/ServerHandle.o: In function `__pyx_f_12ServerH
andle_12ServerHandle_connect':
/cygdrive/e/Programmieren/Spiele/VirtualWorld/ServerHandle/pyrex/ServerHandle.c:
99: undefined reference to `_ServerHandle_connect'
build/temp.cygwin-1.5.18-i686-2.4/ServerHandle.o: In function `__pyx_f_12ServerH
andle_12ServerHandle___init__':
/cygdrive/e/Programmieren/Spiele/VirtualWorld/ServerHandle/pyrex/ServerHandle.c:
66: undefined reference to `_ServerHandle_init'
build/temp.cygwin-1.5.18-i686-2.4/ServerHandle.o: In function `__pyx_f_12ServerH
andle_12ServerHandle_connect':
/cygdrive/e/Programmieren/Spiele/VirtualWorld/ServerHandle/pyrex/ServerHandle.c:
99: undefined reference to `_ServerHandle_connect'
build/temp.cygwin-1.5.18-i686-2.4/ServerHandle.o: In function `__pyx_f_12ServerH
andle_12ServerHandle___init__':
/cygdrive/e/Programmieren/Spiele/VirtualWorld/ServerHandle/pyrex/ServerHandle.c:
66: undefined reference to `_ServerHandle_init'
collect2: ld returned 1 exit status
error: command 'c++' failed with exit status 1
Ich glaube das ist ein Fehler den ich in den .pyx dateien gemacht habe. Nur was habe ich flasch gemacht?
Antworten