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.

One Solution collect form web for “ctypes cdecl дает 4 байта при вызове gcc скомпилированной dll, возвращающей структуру”

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

 b = cpBB() cpBBNew3(byref(b),1,2,3,4) 
  • Большой файл не сбрасывается на диск сразу после вызова close ()?
  • Сделать Python ответом на изменения в часовом поясе Windows
  • OpenCV для Python 3.x под Windows
  • Какую установку python я должен использовать?
  • Не удается открыть Python. Ошибка 0xc000007b
  • Проблема загрузки модуля mod_wsgi в apache в Windows 64-bit
  • Запустить IPython-ноутбук с выбранным браузером
  • subprocess.call работает не так, как ожидалось
  • Получите предварительный просмотр JPEG PDF в Windows?
  • Python raw_input испортил конкатенацию строк
  • Python 2.7 на Windows, «assert main_name не в sys.modules, main_name» для всех примеров многопроцессорности
  • Python - лучший язык программирования в мире.