问题标签 [ffi]

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 投票
2 回答
890 浏览

ruby - 将 C 结构转换为 FFI::Struct

我很难从 FFI 中的 pcap 库中设置结构。

结构:

相关的 Ruby 代码

以上附函数定义

测试代码(以root身份运行)

输出是

偏移量对我来说看起来不错,但我的 C 非常生锈。我期待 2 个设备:lo 和 eth0 作为名称。

0 投票
1 回答
2856 浏览

c - Go 中的动态 FFI

是否可以动态加载外部 C 库 (dll) 并在 Go 中调用其函数?

我知道有cgo哪些用于静态绑定到 C 函数,但我对动态方式感兴趣。

0 投票
2 回答
904 浏览

c - 当有头文件时,为什么 Ruby FFI 需要 attach_function 调用?

有没有办法将 Ruby FFI 指向头文件而不是编写 attach_function 调用?头文件基本上具有相同的确切信息。

temp_convert.rb:

temp_convert.h:

0 投票
1 回答
301 浏览

haskell - 在 Windows 上使用 c2hs

我正在尝试在 Windows 上使用 libxml-enumerator 包,它(最终)需要使用 c2hs。在尝试构建相关包时,我从 c2hs 收到看似臭名昭著的“不存在”错误。这似乎与没有安装 GCC 有关,但这似乎是一个奇怪的列表,因为我已将 Haskell 的 gcc.exe 副本添加到我的路径中。

有谁知道如何打败这个错误?

0 投票
2 回答
1102 浏览

haskell - 将haskell与c接口

我一直认为用 haskell 创建 midori 插件会很好,但这似乎几乎是不可能的。问题在于通过 ffi 导出 haskell 函数,因为 ghc 编译器使用了大量的 -u 开关。

有没有人看到 haskell 在类似的环境中使用,而不必用 gcc 替换 ghc?如果是这样,它是如何解决的,他们经历了哪些箍?

编辑:要求提供一些示例,所以在这里:

导出.hs

test.c (ifdefs 被剪断)

编译ghc --make -no-hs-main export.hs test.c创建一个可以工作的 a.out 可执行文件。ghc 使用以下命令进行链接:

collect2 --build-id --eh-frame-hdr -m elf_i386 --hash-style=both -dynamic-linker /lib/ld-linux.so.2 -o a.out -z relro -u ghczmprim_GHCziTypes_Izh_static_info -u ghczmprim_GHCziTypes_Czh_static_info -u ghczmprim_GHCziTypes_Fzh_static_info -u ghczmprim_GHCziTypes_Dzh_static_info -u base_GHCziPtr_Ptr_static_info -u base_GHCziWord_Wzh_static_info -u base_GHCziInt_I8zh_static_info -u base_GHCziInt_I16zh_static_info -u base_GHCziInt_I32zh_static_info -u base_GHCziInt_I64zh_static_info -u base_GHCziWord_W8zh_static_info -u base_GHCziWord_W16zh_static_info -u base_GHCziWord_W32zh_static_info -u base_GHCziWord_W64zh_static_info -u base_GHCziStable_StablePtr_static_info -u ghczmprim_GHCziTypes_Izh_con_info -u ghczmprim_GHCziTypes_Czh_con_info -u ghczmprim_GHCziTypes_Fzh_con_info -u ghczmprim_GHCziTypes_Dzh_con_info -u base_GHCziPtr_Ptr_con_info -u base_GHCziPtr_FunPtr_con_info -u base_GHCziStable_StablePtr_con_info -u ghczmprim_GHCziBool_False_closure -u ghczmprim_GHCziBool_True_closure -u base_GHCziPack_unpackCString_closure -u base_GHCziIOziException_stackOverflow_closure -u base_GHCziIOziException_heapOverflow_closure -u base_ControlziExceptionziBase_nonTermination_closure -u base_GHCziIOziException_blockedIndefinitelyOnMVar_closure -u base_GHCziIOziException_blockedIndefinitelyOnSTM_closure -u base_ControlziExceptionziBase_nestedAtomically_closure -u base_GHCziWeak_runFinalizzerBatch_closure -u base_GHCziTopHandler_runIO_closure -u base_GHCziTopHandler_runNonIO_closure -u base_GHCziConc_ensureIOManagerIsRunning_closure -u base_GHCziConc_runSparks_closure -u base_GHCziConc_runHandlers_closure /usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/crt1.o /usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/crti.o /usr/lib/gcc/i486-linux-gnu/4.4.3/crtbegin.o -L/usr/lib/ghc-6.12.1/base-4.2.0.0 -L/usr/lib/ghc-6.12.1/integer-gmp-0.2.0.0 -L/usr/lib/ghc-6.12.1/ghc-prim-0.2.0.0 -L/usr/lib/ghc-6.12.1 -L/usr/lib/gcc/i486-linux-gnu/4.4.3 -L/usr/lib/gcc/i486-linux-gnu/4.4.3 -L/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib -L/lib/../lib -L/usr/lib/../lib -L/usr/lib/gcc/i486-linux-gnu/4.4.3/../../.. -L/usr/lib/i486-linux-gnu export.o export_stub.o test.o -lHSbase-4.2.0.0 -lHSinteger-gmp-0.2.0.0 -lgmp -lHSghc-prim-0.2.0.0 -lHSrts -lm -lffi -lrt -ldl -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/i486-linux-gnu/4.4.3/crtend.o /usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/crtn.o

从上一个命令中删除-u开关(只留下 -l、-L 和一些额外的标志)不会编译并返回(大约 50 行左右)

0 投票
1 回答
766 浏览

ruby - 安装 ScrAPI gem 时出错:ffi 需要 Ruby 版本 >= 1.9.2

我在安装 ScrAPI gem 时遇到问题:

错误:安装 scrapi 时出错:ffi 需要 Ruby 版本 >= 1.9.2。

我正在运行 RVM,如果我执行 ruby​​ -v 我得到:

ruby -v ruby​​ 1.9.2p110(2010-12-20 修订版 30269)[i686-linux]

0 投票
3 回答
2994 浏览

c - 在 Haskell 和 C 之间交换结构化数据

首先,我是 Haskell 初学者。

我计划将 Haskell 集成到 C 中以进行实时游戏。Haskell 做逻辑,C 做渲染。为此,我必须在每个滴答声中相互传递大量复杂的结构化数据(游戏状态)(每秒至少 30 次)。所以传递的数据应该是轻量级的。该状态数据可以放在内存的顺序空间上。Haskell 和 C 部分都应该自由访问州的每个区域。

在最好的情况下,传递数据的代价可能是复制指向内存的指针。在最坏的情况下,通过转换复制整个数据。

我正在阅读 Haskell 的 FFI(http://www.haskell.org/haskellwiki/FFICookBook#Working_with_structs)Haskell 代码看起来明确指定了内存布局。

我有几个问题。

  1. Haskell 可以明确指定内存布局吗?(与 C 结构完全匹配)
  2. 这是真正的内存布局吗?或者需要任何类型的转换?(性能损失)
  3. 如果 Q#2 为真,那么显式指定内存布局时是否会降低性能?
  4. 语法是#{alignment foo}什么?我在哪里可以找到有关此的文档?
  5. 如果我想以最佳性能传递大量数据,我应该怎么做?

*PS 显式内存布局功能,我所说的只是 C# 的 [StructLayout] 属性。这是明确指定内存中的位置和大小。 http://www.developerfusion.com/article/84519/mastering-structs-in-c/

我不确定 Haskell 是否具有与 C 结构的字段匹配的语言结构。

0 投票
2 回答
1584 浏览

c - 常见的 lisp、CFFI 和实例化 c 结构

我已经在谷歌上搜索了大约 3 个小时来寻找这个“问题”的解决方案。我试图弄清楚如何使用 CFFI 在 lisp 中实例化 C 结构。我在c中有一个结构:

简单吧?我有这个结构的自动生成的 CFFI 绑定(我认为是 swig):

这会生成一个带有插槽:X 和:Y 的结构“VECT”,foreign-slot-names 确认了该结构(请注意,我既没有生成绑定也没有编写 C 库(花栗鼠物理),但实际函数是从 lisp 调用的正好)。

我已经进行了广泛的搜索,也许我已经看过 100 次并忽略了它,但我无法弄清楚如何在 lisp 中创建一个 cpVect 实例以用于其他函数。

注意功能:

不仅需要一个 cpVect,还需要一个指向一组 cpVect 的指针,这让我想到了第二个问题:如何创建指向一组结构的指针?

我去过http://common-lisp.net/project/cffi/manual/html_node/defcstruct.html并尝试了代码,但得到“错误:未绑定变量:PTR”(我在 Clozure CL),更不用说看起来只返回一个指针,而不是一个实例。

我是lisp的新手,到目前为止一直很强大,但这是我遇到的第一个真正的问题,我无法弄清楚。谢谢!

0 投票
2 回答
835 浏览

ruby - 帮助 Ruby FFI

我只是尝试进行一些基本的 Windows 调用来打印来自 MIDI 输入设备(键盘)的信息。这些调用似乎有效,但对 midiInOpen 和 midiInStart 的前两个调用返回MMSYSERR_NOMEMand MMSYSERR_INVALHANDLE。我相信这与它有关,ptr = FFI::MemoryPointer.new(:pointer)但我对 FFI 的了解还不够,无法弄清楚。任何帮助表示赞赏。

0 投票
2 回答
3755 浏览

python - 为 Python ctypes 中的结构实现 offsetof()

我似乎无法为 ctypes 中的结构实现 offsetof。我已经看过 ctypes 的常见问题解答,但要么它不起作用,要么我无法弄清楚细节。

它似乎addressof()不适用于结构成员(例如d.weight)。我尝试过其他涉及pointer()and的事情byref(),但没有运气。

当然,我希望它适用于所有架构,无论指针的大小如何,也不管填充的效果如何,所以请不要说只是对所有先前元素的 sizeof() 求和,除非你能确保您正在考虑 C 编译器添加的任何填充。

有任何想法吗?谢谢!