问题标签 [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.
ruby - 将 C 结构转换为 FFI::Struct
我很难从 FFI 中的 pcap 库中设置结构。
结构:
相关的 Ruby 代码
以上附函数定义
测试代码(以root身份运行)
输出是
偏移量对我来说看起来不错,但我的 C 非常生锈。我期待 2 个设备:lo 和 eth0 作为名称。
c - Go 中的动态 FFI
是否可以动态加载外部 C 库 (dll) 并在 Go 中调用其函数?
我知道有cgo
哪些用于静态绑定到 C 函数,但我对动态方式感兴趣。
c - 当有头文件时,为什么 Ruby FFI 需要 attach_function 调用?
有没有办法将 Ruby FFI 指向头文件而不是编写 attach_function 调用?头文件基本上具有相同的确切信息。
temp_convert.rb:
temp_convert.h:
haskell - 在 Windows 上使用 c2hs
我正在尝试在 Windows 上使用 libxml-enumerator 包,它(最终)需要使用 c2hs。在尝试构建相关包时,我从 c2hs 收到看似臭名昭著的“不存在”错误。这似乎与没有安装 GCC 有关,但这似乎是一个奇怪的列表,因为我已将 Haskell 的 gcc.exe 副本添加到我的路径中。
有谁知道如何打败这个错误?
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 行左右)
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]
c - 在 Haskell 和 C 之间交换结构化数据
首先,我是 Haskell 初学者。
我计划将 Haskell 集成到 C 中以进行实时游戏。Haskell 做逻辑,C 做渲染。为此,我必须在每个滴答声中相互传递大量复杂的结构化数据(游戏状态)(每秒至少 30 次)。所以传递的数据应该是轻量级的。该状态数据可以放在内存的顺序空间上。Haskell 和 C 部分都应该自由访问州的每个区域。
在最好的情况下,传递数据的代价可能是复制指向内存的指针。在最坏的情况下,通过转换复制整个数据。
我正在阅读 Haskell 的 FFI(http://www.haskell.org/haskellwiki/FFICookBook#Working_with_structs)Haskell 代码看起来明确指定了内存布局。
我有几个问题。
- Haskell 可以明确指定内存布局吗?(与 C 结构完全匹配)
- 这是真正的内存布局吗?或者需要任何类型的转换?(性能损失)
- 如果 Q#2 为真,那么显式指定内存布局时是否会降低性能?
- 语法是
#{alignment foo}
什么?我在哪里可以找到有关此的文档? - 如果我想以最佳性能传递大量数据,我应该怎么做?
*PS 显式内存布局功能,我所说的只是 C# 的 [StructLayout] 属性。这是明确指定内存中的位置和大小。 http://www.developerfusion.com/article/84519/mastering-structs-in-c/
我不确定 Haskell 是否具有与 C 结构的字段匹配的语言结构。
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的新手,到目前为止一直很强大,但这是我遇到的第一个真正的问题,我无法弄清楚。谢谢!
ruby - 帮助 Ruby FFI
我只是尝试进行一些基本的 Windows 调用来打印来自 MIDI 输入设备(键盘)的信息。这些调用似乎有效,但对 midiInOpen 和 midiInStart 的前两个调用返回MMSYSERR_NOMEM
and MMSYSERR_INVALHANDLE
。我相信这与它有关,ptr = FFI::MemoryPointer.new(:pointer)
但我对 FFI 的了解还不够,无法弄清楚。任何帮助表示赞赏。
python - 为 Python ctypes 中的结构实现 offsetof()
我似乎无法为 ctypes 中的结构实现 offsetof。我已经看过 ctypes 的常见问题解答,但要么它不起作用,要么我无法弄清楚细节。
它似乎addressof()
不适用于结构成员(例如d.weight
)。我尝试过其他涉及pointer()
and的事情byref()
,但没有运气。
当然,我希望它适用于所有架构,无论指针的大小如何,也不管填充的效果如何,所以请不要说只是对所有先前元素的 sizeof() 求和,除非你能确保您正在考虑 C 编译器添加的任何填充。
有任何想法吗?谢谢!