gpt4 book ai didi

Python CFFI 不会将 typedef 从 cdef() 复制到生成的 C 文件中

转载 作者:太空宇宙 更新时间:2023-11-04 06:56:18 27 4
gpt4 key购买 nike

我将生成的头文件输入到 ffi.cdef() 中,开头有一堆这样的 typedef:

typedef enum
{
LE_GPIO_EDGE_NONE = 0,
LE_GPIO_EDGE_RISING = 1,
// ...etc...
}
le_gpio_Edge_t;

然后我尝试编译它:

with open(args.api_name + '_cdef.h') as f:
cdef = f.read()

ffibuilder.cdef(cdef)
if __name__ == "__main__":
ffibuilder.compile(verbose=True)

但是它生成的 C 代码是这样的:

static int _cffi_const_LE_GPIO_EDGE_RISING(unsigned long long *o)
{
int n = (LE_GPIO_EDGE_RISING) <= 0;
*o = (unsigned long long)((LE_GPIO_EDGE_RISING) | 0); /* check that LE_GPIO_EDGE_RISING is an integer */
return n;
}

这会导致构建失败,因为符号 LE_GPIO_EDGE_RISING 未在任何地方定义(或在其他任何地方引用)

le_gpio.c: In function ‘_cffi_const_LE_GPIO_EDGE_RISING’:
le_gpio.c:494:12: error: ‘LE_GPIO_EDGE_RISING’ undeclared (first use in this function)
int n = (LE_GPIO_EDGE_RISING) <= 0;

最佳答案

方法 ffibuilder.set_source 似乎将类型定义放置到生成的 C 文件中。

import cffi

ffibuilder = cffi.FFI()

tdef = r"""
typedef enum
{
LE_GPIO_EDGE_NONE = 0,
LE_GPIO_EDGE_RISING = 1,
// ...etc...
} le_gpio_Edge_t;
"""

ffibuilder.set_source("package._foo", tdef)
ffibuilder.cdef(tdef)

if __name__ == "__main__":
ffibuilder.compile(verbose=True)

参见 documentation for c_header_source argument of set_source .

关于Python CFFI 不会将 typedef 从 cdef() 复制到生成的 C 文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43990509/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com