当调用gcc编译的dll返回一个结构时,ctypes cdecl给出了4个字节

我有ac库(花栗鼠),我想打电话使用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

然后python看起来像

 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进行编译,会在库的其他部分中创build分段错误,这就是为什么得到cdecl工作的原因。

Solutions Collecting From Web of "当调用gcc编译的dll返回一个结构时,ctypes cdecl给出了4个字节"