问题标签 [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 回答
67 浏览

common-lisp - 如何在 CFFI 中存储元对象的输出

我有这个函数标量,它是上面注释的 2 个函数定义的包装器。我的 ?是我如何 mem-aref 的输出(scalar 1 2 3 4)#<CV-SCALAR {10044559D3}> 我认为这#<CV-SCALAR {10044559D3}>被称为 Meta-Object

0 投票
0 回答
95 浏览

ubuntu - 在使用 BUILDAPP 构建可执行文件之前,如何加载库。在 Ubuntu 上使用 SBCL

我正在尝试使用 buildapp 在运行 (cffi:null-pointer) 作为测试函数之前加载 cffi,以确保我可以构建 cffi 可执行文件。

cffi 位于/home/w/quicklisp/dists/quicklisp/software/cffi_0.11.2我的盒子上。根据 buildapp 文档,这就是我试图做到的方式。这里

但我收到此错误:Component "cffi" not found1

这是众多尝试之一:

任何有关如何做到这一点的帮助表示赞赏。我不是 Ubuntu Trusty,使用 SBCL、QUICKLISP,在 /home/w/quicklisp/dists/quicklisp/software/cffi_0.11.2 目录的终端中运行它,

0 投票
0 回答
133 浏览

common-lisp - 如何定义 CFFI 外部类型,以便它可以在接受不同外部类型作为参数的函数中使用

我有这 3 个 defcfuns,用于包装在 C 中的 OpenCV 函数(C++)(包括 C 和 C++ 函数定义),前 2 个,%brisk并且surf0都可以用作(self feature-detector)底部的参数,%feat-detect-detect. 如果前两个的输出和self参数feat-detect-detect只是:指针,但是我需要将它们的所有三种类型都定义为与页面底部的类型类似,这样我才能使用终结器。这三个的所有终结器和类型都是相同的,只需在页面底部的四个函数中替换 inbrisksurffor feature-detector,您就会知道每个函数的样子。我应该只调用输出类型brisksurf输入类型吗?feat-detect-detect使用相同的名称,并使它们都在页面底部使用相同的 4 个函数类型/终结器组合,或者有更好的方法。

0 投票
1 回答
807 浏览

c - 使用 CFFI 从 Common Lisp 向堆栈上的 C 函数传递和返回结构

这是对Common lisp, CFFI, and instantiating c structs问题的跟进,所以基本上这个问题是关于使用 CFFI 从 Common Lisp 向堆栈上的 c 函数传递和返回 c 结构。

上面链接的问题的答案(从 2010 年开始)是不可能的。

当前版本的 CFFI 支持通过 libffi 在堆栈上传递和返回结构,如本问题中所述。但是,libffi 引入了另一个依赖项,并且 libffi 在我所针对的所有系统上进行编译并非易事。因此我尽量不使用 libffi,因为我只有很少的这样的函数可以调用。

正如我链接到的第一个问题中所讨论的,可以通过解构结构来调用期望堆栈上的结构参数的 c 函数。例如,这是一个结构和一个函数定义:

可以使用 Common Lisp 调用此函数

现在,我有两个问题:

  1. 这确定适用于所有平台吗?我会假设在 C 中,根据定义,这种情况下的结构的布局与各个参数的布局完全相同,因此这可以保证工作,但我不确定。

  2. 返回结构呢?假设一个 C 函数

    是否有可能在不使用 libffi 的情况下从 Common Lisp 以某种方式调用它,例如通过告诉 CFFI 返回结构将占用多少内存,然后手动“解析”它?

0 投票
1 回答
75 浏览

common-lisp - 与 progn 一起使用时的 common-lisp cffi 评估顺序

我用 C 语言创建了一个简单的共享库,只有一个函数:

然后,在编译之后,我使用 cffi 将该库加载到一个 lisp 程序中:

然后我使用 cffi:defcfun 定义了“sayHello”:

一切都很好,如果我从 lisp 调用 sayHello,它会按预期工作:

(注意 '?' 是 Clozure CL 的 REPL 提示符)

现在我的实际问题,看这个:

我在 REPL 运行了 3 个语句。看看最后一个的输出,“Hello World”是在“HELLO”被打印之前打印的,这不是(progn ...)应该如何工作的。它在前 2 个语句中正常工作。

我无法理解这种奇怪的行为。我用 SBCL 和 Clozure(在 Ubuntu 14.04 x64 上)对其进行了测试,两者都给出了相同的结果。

0 投票
0 回答
353 浏览

lisp - 在 Windows 上使用 cl-glfw3

我正在尝试使用 sbcl amd64 为 Windows 加载库 cl-glfw3。但我得到的只是一条缺少 dll 的消息。libffi-6.dll 和 glfw3.dll 与 lisp 程序位于同一文件夹中。

将文件复制到 windows 文件夹不起作用。

在linux上它工作正常。

0 投票
2 回答
363 浏览

common-lisp - cffi 函数调用挂起

我想使用Common Lisp 中的stat(2)

我已经定义了stat函数使用的结构:

以及函数本身:

我试图这样简单地称呼它:

史莱姆就挂了。没有错误,REPL 输入也不会返回。

0 投票
1 回答
284 浏览

io - C printf 打印的文本在哪里

我碰巧遇到了通过 cffi 从 SBCL 调用 C printf 函数的问题。问题是当我调用 printf 函数时,我找不到输出文本,只是在 REPL 上显示 printf 函数的返回值。但是当我退出 SBCL 时,输出文本会神奇地出现在终端上。

最后一行,“hello$”表示当从 SBCL 退出时,文本“hello”出现在终端上,后面跟着 shell 提示符“$”。那么 printf 将文本“hello”打印到哪里呢?

我在 *standard-output* 上尝试了 `finish-output'、`force-output' 但这不起作用。

0 投票
1 回答
181 浏览

encoding - 将lisp字符串从/转换为C字符串时编码'utf-16'不一致

我发现当使用'utf-16'作为编码将lisp字符串转换为cffi的C字符串时,实际使用的编码是'utf-16le'。但是,当将 C 字符串转换回 lisp 字符串时,使用的实际编码是 'utf-16be'。由于我还不熟悉“babel”(它为“cffi”提供了编码工具),我不确定这是否是一个错误。

`convtest' 将 lisp 字符串转换为 C 字符串,然后再转换回 lisp 字符串,使用 `to-c'、`from-c' 作为编码。所有输出的垃圾字符串都是一样的。从测试中我们看到,如果我们同时使用'utf-16'作为'to-c'和'from-c',转换失败。

0 投票
1 回答
360 浏览

winapi - CFFI 和 win32 剪贴板访问

我是 Common Lisp 的新手,并在上面做了一些实验。我正在努力获得对 Windows 剪贴板的访问权限,然后我找到了这个参考:

https://groups.google.com/forum/#!topic/comp.lang.lisp/hyNqn2QhUY0

这是完美的,除了它是为 CLISP FFI 量身定制的,我希望它与 CFFI 一起使用。然后我尝试转换代码,并部分成功,但例程(get-clip-string)存在问题,在 WinXP(!)上使用 Clozure CL 1.10 进行测试:

测试文本:拥有太空服-Will Travel

? (获取剪辑字符串)

错误:值“拥有太空服-将旅行”不是预期的类型(UNSIGNED-BYTE 32)。执行时:GLOBAL-LOCK-STRING,在进程监听器(1)中。键入 :POP 以中止, :R 以获取可用重新启动的列表。类型 :?其他选项。

我想我没有得到 CFFI 上的类型(虽然我已经阅读了手册),或者 CLISP 上的原始处方。有人提示吗?以下命令序列有效,但恐怕这不安全:

(open-clip 0) (get-clip 1) (close-clip 0)

这是代码: