ctypes cdecl donne 4 octets manquants lors de l’appel de gcc compilé

J’ai une bibliothèque AC (chipmunk) que je veux appeler en utilisant ctypes. Cependant, il échoue sur les fonctions qui renvoient une structure?

L’erreur que je reçois est

File "qw.py", line 19, in  b = cpBBNew3(1,2,3,4) ValueError: Procedure called with not enough arguments (4 bytes missing) or wrong calling convention 

Ceci est le code (pertinent): dans cpBB.h

 typedef struct cpBB { cpFloat l, b, r ,t; } cpBB; cpBB cpBBNew3(cpFloat l, cpFloat b, cpFloat r, cpFloat t); 

dans cpBB.c

 cpBB cpBBNew3(cpFloat l, cpFloat b, cpFloat r, cpFloat t) { cpBB bb = {l, b, r, t}; return bb; } 

compilé avec

gcc -O3 -std = gnu99 -shared -c

gcc -O3 -std = gnu99 -shared -s

Alors le python ressemble

 from ctypes import * chipmunk_lib = cdll.LoadLibrary('''C:/code/pymunk/trunk/pymunk/chipmunk.dll''') class cpBB(Structure): pass cpBB._pack_ = 4 cpBB._fields_ = [ ('l', c_double), ('b', c_double), ('r', c_double), ('t', c_double), ] cpBBNew3 = chipmunk_lib.cpBBNew3 cpBBNew3.restype = cpBB cpBBNew3.argtypes = [c_double, c_double, c_double, c_double] b = cpBBNew3(1,2,3,4) 

Cet exemple particulier fonctionne si je comstack avec -mrtd et utilise windll (en utilisant stdcall). Cependant, l’utilisation de stdcall sur l’ensemble de la bibliothèque crée des erreurs de segmentation dans d’autres parties de la bibliothèque lors de la compilation avec des optimisations et une nouvelle version de GCC. C’est pourquoi il serait intéressant de faire fonctionner cdecl.

Selon la taille de la structure et du compilateur / plate-forme, cdecl peut renvoyer des structures en transmettant un pointeur caché à une structure allouée par l’appelant avant les parameters normaux. Essayez ce qui suit:

 b = cpBB() cpBBNew3(byref(b),1,2,3,4)