C++ 将Python CFFI与.lib和一堆.dll和.h文件一起使用

C++ 将Python CFFI与.lib和一堆.dll和.h文件一起使用,c++,python-2.7,python-cffi,C++,Python 2.7,Python Cffi,我需要为专有库编写Python2包装,它由几个.h文件(我制作了一个大文件)、一堆.dll和一个.lib文件组成,用于链接所有这些内容 我想我需要API级别,因为.h文件中有这么多“typedef” 创建包装器的脚本:build_wrapper.py 来自cffi导入FFI 导入设置工具 ffibuilder=FFI() ffibuilder.set\u unicode(enabled\u flag=True) 将open(os.path.join(curdir,'include','ScadW

我需要为专有库编写Python2包装,它由几个.h文件(我制作了一个大文件)、一堆.dll和一个.lib文件组成,用于链接所有这些内容

我想我需要API级别,因为.h文件中有这么多“typedef”

创建包装器的脚本:build_wrapper.py

来自cffi导入FFI
导入设置工具
ffibuilder=FFI()
ffibuilder.set\u unicode(enabled\u flag=True)
将open(os.path.join(curdir,'include','ScadWrapper.h'),'r')作为f:
source=f.read()
ffibuilder.set_源(“U包装器”),源,
额外链接参数=[r'C:\Documents\python\pyScadApi\pyScadApi\include\SCADAPIX.lib',],
source_扩展='.cpp')
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
ffibuilder.compile(verbose=True)
此操作在创建库时不会出错。\Release\\u wrapper.lib和object。\Release\\u wrapper.exp

但是比如说,

from _wrapper import ffi, lib

lp_api = ffi.new('ScadAPI *')
r = lib.ApiCreate(lp_api)
失败于

lp_api = ffi.new('ScadAPI *')
ffi.error: undefined type name
ScadAPI *
ScadAPI
定义为

struct APIHandle_tag;
typedef APIHandle_tag * ScadAPI;

在ScadWrapper.h

中,您从未调用
ffibuilder.cdef()
。这就是
lib
对象为空的原因:它不知道任何类型或函数


对不起,我说得太简短了。我的观点是,基础知识是在上面解释的。按照“真实示例”,想法是只在cdef()中编写您感兴趣的部分,一个接一个的函数,以及适当使用
的类型声明。您在cdef()中编写的每个函数或类型都可以调用(通过
lib.the_function\u name()
)或用于ffi操作(
ffi.new()
),等等)


cffi有不同的方法(没有直接记录或支持),它们试图一次公开整个大型库,而不需要任何逐个函数的工作,不管它有多小。其思想是从.h文件(可能由
gcc-E
预处理)中提取cdef()可以接受的内容。缺点是,特别是如果您使用
gcc-E
,结果可能只适用于您的确切操作系统。此外,这种方法看起来更快,但通常不是:它似乎避免了每个函数的工作,但这永远都不是真的,因为如果您要在某个地方使用该函数,那么无论如何您都需要花时间编写该函数调用。

很抱歉回答得太长。如果我将.h文件的内容传递给cdef(),我会在语法方面出现一系列错误。CdFe()是否允许C++语法?也许我必须消除所有这些疯狂的typedef并使用标准的C类型?@alfnak cdef只允许C定义。没有C++,没有包含,没有语法等。只是简单的定义,偶尔会有“…”提示来填充你不需要的定义。