gpt4 book ai didi

c++ - 将 Python CFFI 与 .lib 以及一堆 .dll 和 .h 文件一起使用

转载 作者:行者123 更新时间:2023-11-28 05:18:55 25 4
gpt4 key购买 nike

我需要为专有库编写 Python2 包装器,包括几个 .h 文件(我做了一个大文件)、一堆 .dll 和一个 .lib 文件来链接所有这些东西。

我认为我需要 API 级别,因为 .h 文件中的所有这些“typedef”

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

from cffi import FFI
import setuptools

ffibuilder = FFI()
ffibuilder.set_unicode(enabled_flag=True)
with open(os.path.join(curdir, 'include', 'ScadWrapper.h'), 'r') as f:
source = f.read()

ffibuilder.set_source('_wrapper', source,
extra_link_args=[r'C:\Documents\python\pyScadApi\pyScadApi\include\SCADAPIX.lib', ],
source_extension='.cpp')


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

这运行没有错误Creating library .\Release\_wrapper.lib and object .\Release\_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 对象为空的原因:它不知道任何类型或函数。


抱歉我太简短了。我的观点是基础知识在 http://cffi.readthedocs.io/en/latest/overview.html 上有解释。 .按照“真实示例”,想法是只在 cdef() 中编写您感兴趣的部分,一个接一个的函数,以及适当使用 ...; 的类型声明>。您在 cdef() 中编写的每个函数或类型都可用于调用(通过 lib.the_function_name())或用于 ffi 操作(ffi.new() 等) .

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

关于c++ - 将 Python CFFI 与 .lib 以及一堆 .dll 和 .h 文件一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41943364/

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