问题标签 [cffi]

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 回答
1763 浏览

c++ - 我可以用 C 包装 OpenCV 的 C++ 接口,然后用 Lisp 的 CFFI 包装它吗?

我还想知道是否有可能将 OpenCV 的 C++ 接口包装在 C 中,然后将其包装在 Lisp 中,这样我就可以将所有 C++ 功能也添加到我的 cl-opencv 包装器中,因为我想让它完整....也想知道如果我这样做,我可以在 lisp 中使用 C++ 包装器和 C 包装器吗......一起......就像使用 cv::namedWindow 而不是 cvNamedWindow 而所有其他部分都是 c ......这是我的尝试,当我只使用 cv::namedWindow 但失败时,下面的程序运行

当我添加 cv::imshow

我想知道它是否可行......就像在我开始之前 100% 确定一样,我至少可以将每个 c++ 函数包装在 c 中并用 lisp 包装......或者如果你认为 id 遇到障碍有些地方甚至是不可能的......而且还会将它包裹两次使其变慢吗?并且 id c 接口比 c++ 更好/更差..或者我可以在 c 接口中完成我在 c++ 中可以做到的所有事情

我问这个是因为在 swig 和 cffi 文档中它说 C++ 支持不完整。

哦,是的,我还尝试使用所有这些标头运行上述代码

仍然得到上述错误

0 投票
1 回答
418 浏览

c - 如何在 CFFI 中包装包含结构指针的结构?

IplImage结构文档描述了该IplROI* roi插槽,它似乎是指向IplROI struct核心types_c.h头文件中定义的指针:

但它也描述了IplImage* maskROI插槽,并且在核心types_c.h文件中没有 typedef 结构......

如果有人可以帮助我找到它,我将不胜感激,但我确实 grep 了整个 opencv 下载,但一无所获.....我试图用 lisp 包装 IplImage 结构,我用 swig 包装它并得到了这个

我在这里改变了一点

因此,当我在 emacs 中运行以下代码(显示输出)时,所有插槽值都将与来自完全相同代码的 opencv 输出匹配,它们会这样做,因此我可以使用 ipl-image 结构访问 ipl-roi 结构线

因为我的直觉告诉我这是正确的方式

但是对于 IplImage* maskROI 插槽,没有要包装的结构,所以我希望有人能给我一个关于如何包装包含 CFFI 中的结构指针的结构的快速课程,如果我认为这一行是正确的

是正确的做法以及如何使用它

我真的很感激这方面的任何帮助

编辑

0 投票
3 回答
474 浏览

c - 我如何为此 cffi:translate-from-foreign 编写一个可比较的 cffi:translate-into foreign defmethod?

好的,我尝试了这种从外部翻译的方法,它确实有效

我的 CvGetSize 和 cvCreateImage、get-size 和 create-image 的 opencv 包装器是这样定义的

这里是 size->int64 的定义

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

所以我想知道您是否可以向我展示如何将以下方法的翻译成外文版本,这真的会让我的图书馆很棒

我打算尝试一些东西并添加它,但是对于 get-size 输出结构,它不是一个 plist,所以不确定要放什么

部分,对于

部分,我希望找到除 size->64 函数之外的另一种方法,因为这是 2 年前 cl-opencv https://github.com/ryepup/cl-opencv第一次问世时制作的,我想做比这更好的包装器...我已经使用 cl-opencv 添加了 100 个新函数 5000 行代码示例和文档以及一个新的 structs.lisp 文件,所以如果有人可以帮助我使用所有最新的 cffi 工具,我会很高兴所以我可以做除 int64 之外的其他事情......加上如果我有一个函数来包装 int64 的东西不起作用的地方我已经准备好了

再次感谢所有关于 SO 的回答者,你们真的帮助了我的图书馆。

编辑

好的,我想我把你定义为马德拉先生如下(我展示了 repl 会话)

但我得到错误

因为我拥有的 translate-from-foreign 函数正在将输出从 cv-size 转换为结构

我很欣赏翻译成外来函数,但旧的从外来翻译函数不起作用,因为 make-size 部分......你能帮我弄清楚 cvCreateImage 需要什么来满足它......这是链接4:

http://docs.opencv.org/modules/core/doc/old_basic_structures.html?highlight=eimage#createimage

我可以让下面的这个版本正常运行(我显示了 repl 会话)

所以我从 ipl-image 的插槽中获取数据,但这似乎不是正确的方法,因为 id 必须能够通过 get-size 取消引用 cv-size 指针输出

这是关于 cvGetSize 函数的文档,我正在包装

http://docs.opencv.org/modules/core/doc/old_basic_structures.html?highlight=eimage#getsize

如您所见,它是一个指针

所以当我这样做时:

我明白了

当我这样做的时候

我明白了

(346539 0)

只是无意义的输出

我尝试使用 mem-refing 和 mem-arefing 指针并得到未处理的内存故障错误

如果你能帮我弄清楚如何写兼容

外文翻译

翻译成外文功能我将非常感激=)。

但是如果我在其中的任何位置使用 make-size 或 size-width,height ,那么 create-image 必须在其中包含 size->int64 ,因为它们仅因为该功能而起作用。

0 投票
1 回答
365 浏览

common-lisp - 代码在 SLIME+SBCL 中运行,但不是普通的 SBCL

我一直在尝试为 CFFI 绑定构建一个 lispy 接口(https://gitorious.org/dh-misc/hdf5/source/cb616fd619a387e3cdc927994b9ad12b6b514236 :) 但我遇到了代码在具有 SBCL 的 SLIME 中正确运行的情况实例作为后端,但每当我在 SBCL 中运行代码时都不会运行。

因此,我创建了一个演示错误的测试用例文件:

我在 SLIME+SBCL 中运行 (hdf5test:test "test.h5") 得到的输出是

我在 SBCL 中运行 (hdf5test:test "test.h5") 得到的输出是

所以你可以看到这与数组如何传递给 hdf 函数有关,但我不知道为什么 SLIME+SBCL 会处理这个问题而不是 SBCL。

我也用 CLISP 尝试了完全相同的代码,它工作正常,没有问题,所以它似乎是一个 SBCL 问题。

对此有什么想法吗?

编辑:我想我应该在主帖中添加结果文件在每种情况下确实不同。在 SLIME+SBCL 或 CLISP 中,该文件包含一个有限数据集,其中包含平方整数(实际上没有任何原因,只是一个测试)。但是,对于普通的 SBCL,数据文件是不完整的;如果您尝试使用 h5dump 查看内容,这是一次无休止的零试验(这就是它处理不完整数据集的方式)。

0 投票
1 回答
557 浏览

common-lisp - How to set C compiler in defsystem?

I'm trying to loads cl-mpi system with quicklisp. This is the system definition:

#xA;

This fails to compile because it "doesn't know" what $CC is set to. I need it to be set to mpicc. I found the code, where I think it sets it:

#xA;

The above is inside the asdf package. However I can't understand how to change the defsystem to account for the compiler.

PS: This is what the error looks like:

#xA;

formatted for readability. The compiler doesn't find the header because it's not the proper compiler (mpicc "knows" where to look for mpi.h header, it won't be looking in the /usr/include).


Sorry for the confusion. I could set $CC to mpicc, but it still doesn't find /usr/include/mpich-x86_64/mpi.h header - so maybe I need to set include path rather than compiler? If so, how?

This is how I managed to set it to mpicc:

#xA;

before defsystem

EDIT: Whoops, it's cffi that generates the bad include :( which looks like this:

#xA;

instead of:

#xA;

Is there any way to do something about it?


Applying lots of hackery and trickery I could get it working. It appears that the path to the library was set in the code itself, so I had to

#xA;

I also had to make several changes particular to my system to compile the whole thing.

But, I would like this question to be answered in general, if possible! I.e., what is the way to set the C compiler and its options in a generic and acceptable way?

0 投票
1 回答
1489 浏览

windows - CFFI 不加载依赖库?

我正在尝试使用 SBCL 的 BLAS/LAPACK 库(特别是尝试让LLA包运行)。我在加载 BLAS 共享库时遇到了很多麻烦;最终我发现它无法加载它的依赖库。最终,我能够通过手动加载其所有依赖项来加载 BLAS:

作为一种解决方法,这并不可怕,但我不明白为什么 CFFI:LOAD-FOREIGN-LIBRARY 无法找到并加载依赖项本身。难道我做错了什么?

0 投票
1 回答
150 浏览

ffi - 对比 CFFI 与 FFI

我从 impnotes 32.3 看到 clisp 有一个 FFI 系统。我还在http://common-lisp.net/project/cffi/看到了一个 CFFI 项目。

有知识的人可以详细说明这两个系统之间的任何重要区别吗?哪个是“更好”/“更官方”/“推荐”/“更高效”/“更可靠”等?

非常感谢,R。

0 投票
0 回答
166 浏览

common-lisp - 如何加速这个 Common Lisp/CFFI 代码,一个包含在 let 中的 defun

这是代码,它按预期工作:

%vector-int-to-c-array 函数并不重要,但要运行它(来自上面的代码):

一百万次运行需要 0.5 秒。如果我运行该vector-int函数,则需要 0.68 秒,而没有(v (if (< n 5) :float :int))参数和“除非”s 表达式。但如上所述,运行 100 万次需要 1.5 秒。我需要 n 虽然是 :float 如果 n 小于 5 或​​ :int 如果 n 是 5 或更大。谁能帮我将这段代码加速到不超过 0.68 秒,运行 100 万次。唯一需要注意的是我需要保留 cond 语句..因为我将这段代码缩减为显示在这里,并且在这部分加速后我还有其他条件要添加,当我vector-int再次运行时,我必须能够更改 n 并拥有更新后的 n 会自动计算。

0 投票
1 回答
299 浏览

c++ - 如何在 0(1) 操作中将 c++ 向量转换为 lisp 向量

我有这些用于 C++ 的 C 绑定,这些 C 绑定vector<int>在 CFFI 中。

我知道如何创建vector<int>sstd_carrayTovector并将数据转换回int指针 with ,std_vectorToCArray以便我可以使用 CFFI 函数在 Lisp 中从中检索数据MEM-AREF。我defcfun为下面的内容写了正确的。

我的问题是:如何将defcfunfor的输出转换std_vectorToCArray为 Lisp 向量(例如#(1 2 3))并使其成为 O(1) 操作——即同时复制所有数据。

0 投票
1 回答
415 浏览

common-lisp - Common Lisp:这不是数字 NIL 和 &rest 参数

((pointerp (first args)) (mem-aref (%vector-float-to-c-array (first args)) :float (second args)))在下面代码的这一行中,(second args)编译时带有警告This is not a number NIL。该功能有效,但我如何仅使用 Lisp 以独立于实现的方式摆脱此警告。解决方案需要非常快。该代码需要很长时间才能正确运行并且运行良好,因此我无法真正更改它的操作。您不认识的功能与警告消失无关紧要……提前感谢您的帮助。