ctypes cdecl дает 4 байта при вызове gcc скомпилированной dll, возвращающей структуру

У меня есть библиотека ac (chipmunk), которую я хочу вызвать с помощью ctypes. Однако он не работает на функции, которые возвращают структуру?

Ошибка, которую я получаю

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

Это (соответствующий) c-код: в cpBB.h

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

в cpBB.c

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

скомпилированный с

gcc -O3 -std = gnu99 -shared -c

gcc -O3 -std = gnu99 -shared -s

Тогда питон выглядит

 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) 

Этот конкретный пример работает, если я компилирую с -mrtd и использую windll (используя stdcall). Однако использование stdcall во всей библиотеке создает ошибки сегментации в других частях библиотеки при компиляции с оптимизацией и новой версией GCC, поэтому было бы неплохо заставить работать cdecl.

В зависимости от размера структуры и компилятора / платформы, cdecl может возвращать структуры, передавая скрытый указатель на выделенную вызовом структуру до обычных параметров. Попробуйте следующее:

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