问题标签 [libffi]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
927 浏览

ruby - 在 solaris 上安装 rb-inotify

我正在尝试在 Solaris 机器上安装 rb-inotify。uname -a的结果:

ruby-1.8.7 和 ruby​​gems-1.7.2 已编译安装但运行后

我收到以下错误消息:

然后我在 rb-notify 的主页上发现它是Linux内核子系统 inotify的包装器。这就是我不能在 Solaris 机器上安装它的原因吗?

但是,我确实知道人们在 Windows 机器上安装 rb-notify 没有任何问题,那么如果inotify是一个“ Linux内核子系统” ,那怎么能工作呢?

0 投票
1 回答
264 浏览

c - 调用函数名,而不是函数指针

libffi 的手册页提供了一个示例,该示例本质上需要一个指向函数的指针(在示例中为puts)。

但是,如果我只知道函数的名称,但实际上没有指针(如果 ffi 用于动态编程语言中通常会发生这种情况),我该怎么办?

说,我想做这样的事情(伪代码):

简而言之,我想让 libffi 动态查找类似于 dlfcn/LoadLibrary 的函数(如果首先由 ffi 支持),然后使用提供的 FFI CIF 类型调用它。

libffi可以做到这一点吗?一个简单的例子会是什么样子?

0 投票
1 回答
5887 浏览

c++ - 可变参数模板:迭代类型/模板参数

我最近一直在使用libffi,并且由于它使用 C API,因此任何抽象都是通过使用 void 指针(好的 ol' C)来完成的。我正在创建一个使用此 API 的类(带有可变参数模板)。类声明如下:(其中Ret=返回值和Args=函数参数)

在这个类中,我还声明了两个不同的函数(简化):

我希望能够使用Callfrom CallbackBind; 这就是我的问题。我不知道我应该如何将void*数组转换为模板化参数列表。这或多或少是我想要的:

如果这无法实现,是否有任何变通方法或不同的解决方案可用?

0 投票
2 回答
959 浏览

c++ - 模板编程:专业化和 enable_if

我正在使用 libffi,并且我创建了一个具有类似模板的类std::function(即class Func<Ret (Args...)> { /* ... */};。我想将返回类型(Ret)和每个参数类型(Args)转换为它们相应的 libffi 类型(请参阅以供参考)。到目前为止我想出了这个:

其中 GetFFIType 函数实现如下:

这行得通,但显然还有一些改进的余地。如果类型无效(即类或结构),则不会在编译时识别(使用 代替会发生运行时错误assert)。我将如何避免这种情况,并使此函数在编译期间确定类型是否有效(原始类型)?

我也不喜欢在enums 的情况下识别基础类型的方式。我更喜欢std::underlying_type<T>改用(在代码中注释掉),但如果类型是 void 指针(type_traits:1762:38: error: ‘void*’ is not an enumeration type) ,它会发出编译错误

我试图使用std::enable_if但没有成功来实现这种行为......请告诉我是否应该解释一些事情,以防听起来有点模糊!

摘要:我想获取 GetFFIType 函数来确定编译期间的所有内容,并且该函数应仅支持原始类型(请参阅this以获得更广泛的参考)

编辑:对不起标题,没有比这更好的了:(

0 投票
4 回答
3171 浏览

c - 在 C 中,给定参数的变量列表,如何使用它们构建函数调用?

假设有一个以某种方式存储的参数列表,例如在一个数组中。

给定一个函数指针,我如何通过存储的参数列表调用它?

我不是想将数组作为参数传递好。你明白了,好吗?我想将它的每个元素作为参数传递。数组只是为了说明,我可以将参数存储在一些元组结构中。另外,看看我手头有一个函数指针,并且可能有一个字符串格式的签名。我不想仅仅定义一个能够处理可变参数列表的函数。

我看到如何做到这一点的唯一方法是使用汇编(由__asm push等人)或这个:

我不太喜欢这种方法...

还有另一种便携式和更短的形式吗?

几种脚本语言能够调用 C 函数。

Python 或 Ruby 等脚本语言如何做到这一点?他们如何以可移植的方式实现它?他们最终是否只是将程序集用于多个平台或以上平台?

看,我真的不是在询问参数封送处理的细节以及从脚本语言到 C 的其他内容,我只对最终在内部如何构建脚本语言对 C 函数的调用感兴趣。

编辑

我会保留问题的标题,但我认为更好的提问方式是:

如何使用仅在运行时可用的指针和签名调用 C 函数?

更新

PLT 方案的外部接口

调出是正常的函数调用。在动态设置中,我们创建一个指定(二进制)输入/输出类型的“调用接口”对象;此对象可与任意函数指针和输入值数组一起使用,以执行对函数的调用并检索其结果。这样做需要操作堆栈并知道如何调用函数,这些都是libffi处理的细节。

感谢@AnttiHaapala 搜索、查找和指向libffi。这是我一直在寻找的,它被一堆脚本语言使用,它是一个可移植的库,跨多个架构和编译器实现。

0 投票
2 回答
1537 浏览

linux - 使用 CMake 查找 libffi 头文件

我需要 libffi 来构建我的 C++ 项目。问题是不存在用于查找 libffi 的预制脚本,并且 ffi.h 位于奇怪的位置,具体取决于库的版本和 Linux 发行版。

这是我的尝试:

但它显然不起作用,因为 Find_Path() 不会递归搜索。如何做得更好?

我尝试使用 CMake 的 pkg-config 模块,但 pkg-config 也找不到它。

[ethon@Fleckstation 论文]$ pkg-config --cflags libffi 在 pkg-config 搜索路径中找不到包 libffi。也许您应该将包含 `libffi.pc' 的目录添加到 PKG_CONFIG_PATH 环境变量中没有找到包 'libffi'

谢谢!

0 投票
1 回答
1015 浏览

linux - Linux libffi-3.0.11 安装问题

我尝试安装 libffi-3.0.11 我跟着那一边

http://www.linuxfromscratch.org/blfs/view/svn/general/libffi.html

但是我收到了这个错误信息。我该如何解决?

0 投票
1 回答
11221 浏览

c++ - 使用 VS2012 编译 libffi 失败并出现致命错误 LNK1281: Unable to generate SAFESEH image

使用 VS11 编译 libffi 会出现以下链接器错误

同一个项目用 VS10 编译得很好,但是用 VS2012 自动升级后,它开始给出链接器错误

MSDN中的解释太晦涩难懂了

我可能会用 重建/SAFESEH:NO,但我不确定其中的含义。

请告知可能出现的问题。

0 投票
3 回答
2116 浏览

c - 使用 cffi-libffi 按值传递结构?

我的印象是 CFFI 不能按值传递结构,但 CFFI 文档说:

要将结构按值传递或返回给函数,请加载 cffi-libffi 系统并将结构指定为(:struct structure-name). 要传递或返回指针,您可以使用:pointer(:pointer (:struct structure-name))

我正在重新包装 cl-opencv 函数get-size,它是这个 opencv 函数的包装器:

并且由于当 cl-opencv 的作者编写库时,我认为 CFFI 没有能力通过 cffi-libffi 系统按值传递结构,所以他必须使用以下所有代码来包装cvGetSize

鉴于上面引用的 CFFI 文档,我将如何按值传递此cvGetSize结构CvSize

我打算更新cl-opencv包,我想知道在 cl-opencv 包中的何处以及如何根据 CFFI 文档“加载 cffi-libffi 系统”,以及在何处“将结构指定为(:struct structure-name)”和“使用 :pointer 或 (:pointer (:struct structure-name))”“传递或返回指针。”

我可以使用上面的cvGetSize包装器来详细说明如何做到这一点:

编辑@Rörd

我很欣赏你的良心回应

无论哪种方式,我都会遇到相同的错误...但是出于测试目的,可以说我像这样将 cffi-libffi 加载到当前会话中(带输出)

它加载,所以我只运行你提供的 defcfun 和 defcstruct (带输出):

我知道 libffi 安装正确,因为加载了 gsll(使用 cffi-libffi)我运行 gsll 测试,它们都通过了这里显示的(带输出)

它似乎没有用 (:struct cv-size) 作为问题来调用 defcfun,因为当我调用它时

我得到同样的错误

我可以像这样运行我的 ipl-image 结构

我的 create-image 包装器现在加载了 cffi-libffi 并且您的 (:struct ipl-image) 运行良好,但...显示输出

创建图像

但是当我跑步时

在 repl 处创建图像没有任何反应,repl 只是挂起......

但是当我使用 ipl-image 而不是 (:struct ipl-image) 运行创建图像包装器时

我可以运行:

很好,然后运行它来访问结构值(带输出)

但我没有得到一个结构值我得到

当我用这个在c中计算出那个值img->colorModel时

所以任何帮助将不胜感激

好的 1 更多编辑:

我又试了一次,它在这里工作是我的输出

不知道我第一次做错了什么,但是...如果您可以检查我的结果并验证我刚刚按值传递了一个结构,我将永远感激不尽

谢谢罗德

好的,如果您仍然有兴趣帮助我调试 Rord,请进行另一个编辑

如果出现错误:

这是导致它的历史(这直接发生在我发布上一个编辑之后,所以我的 emacs 仍然加载了所有上一个编辑代码):

我明白了,因为:

访问你的 defun ...我跟踪它,所以当我运行时 - 显示输出:

我得到错误:

我认为这是因为你的 defcfun 的输出只是一个列表,而 with-foreign-slots 需要一个指针

我跑了这个:

验证,它只是一个列表

顺便说一句,我使用这些功能进行测试

因为有一个更纯粹的输出......创建图像使用我最初发布在顶部的get-size的hackery?

我想使用没有所有hackery的create-image和get-size,并且只使用结构来返回,这样我就可以停止使用make-size并使其更纯粹......所以任何关于它的建议都会成为黄金...这就是我想要创建图像的方式...我只需要让它接受您(Rord's)defcfun的输出...我现在正在尝试打开您的defcfun输出((HEIGHT 480 WIDTH 640)) 指向一个指针......所以它只会在这个

还是整个制造尺寸的东西都是必需品...

也仅供参考我改变了你添加到的defun

现在它可以工作了......如果我把事情搞砸了,如果你的 defun 会更好

编辑!!!!我明白了!!!!

编辑!!!!我都弄明白了!!!!!!!...部分....II - 更好!

@Liam 编辑

好的,我尝试了您的从外国翻译的方法,它确实有效,我在我的 structs.lisp 文件中定义了这些

和 get-size 和 create-image 是这样定义的

这里是 size->int64 的定义

但我喜欢翻译外国定义方法的想法

所以我想知道你是否可以向我展示如何从方法中将以下翻译成外文版本这真的会让我的图书馆唱歌......我的目标是为opencv制作一个完整的cffi包装器和gsll一样好是gsl,所以这真的有助于更快地发生......再次感谢您迄今为止对所有这一切的帮助

0 投票
0 回答
172 浏览

c++ - libffi 没有调用函数

我正在使用 libffi 来调用一个函数。但它没有调用相同的,我也没有收到任何错误。我期待一个浮点值作为返回,但它返回为 0.0000。我确信这不是预期的返回值(尝试过硬编码)。

我在这里做错什么了吗?有什么方法可以检查 ffi_call 是否成功?