问题标签 [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.
common-lisp - 如何在 CFFI 中存储元对象的输出
我有这个函数标量,它是上面注释的 2 个函数定义的包装器。我的 ?是我如何 mem-aref 的输出(scalar 1 2 3 4)
,#<CV-SCALAR {10044559D3}>
我认为这#<CV-SCALAR {10044559D3}>
被称为 Meta-Object
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 目录的终端中运行它,
common-lisp - 如何定义 CFFI 外部类型,以便它可以在接受不同外部类型作为参数的函数中使用
我有这 3 个 defcfuns,用于包装在 C 中的 OpenCV 函数(C++)(包括 C 和 C++ 函数定义),前 2 个,%brisk
并且surf0
都可以用作(self feature-detector)
底部的参数,%feat-detect-detect
. 如果前两个的输出和self
参数feat-detect-detect
只是:指针,但是我需要将它们的所有三种类型都定义为与页面底部的类型类似,这样我才能使用终结器。这三个的所有终结器和类型都是相同的,只需在页面底部的四个函数中替换 inbrisk
和surf
for feature-detector
,您就会知道每个函数的样子。我应该只调用输出类型brisk
和surf
输入类型吗?feat-detect-detect
使用相同的名称,并使它们都在页面底部使用相同的 4 个函数类型/终结器组合,或者有更好的方法。
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 调用此函数
现在,我有两个问题:
这确定适用于所有平台吗?我会假设在 C 中,根据定义,这种情况下的结构的布局与各个参数的布局完全相同,因此这可以保证工作,但我不确定。
返回结构呢?假设一个 C 函数
是否有可能在不使用 libffi 的情况下从 Common Lisp 以某种方式调用它,例如通过告诉 CFFI 返回结构将占用多少内存,然后手动“解析”它?
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 上)对其进行了测试,两者都给出了相同的结果。
lisp - 在 Windows 上使用 cl-glfw3
我正在尝试使用 sbcl amd64 为 Windows 加载库 cl-glfw3。但我得到的只是一条缺少 dll 的消息。libffi-6.dll 和 glfw3.dll 与 lisp 程序位于同一文件夹中。
将文件复制到 windows 文件夹不起作用。
在linux上它工作正常。
io - C printf 打印的文本在哪里
我碰巧遇到了通过 cffi 从 SBCL 调用 C printf 函数的问题。问题是当我调用 printf 函数时,我找不到输出文本,只是在 REPL 上显示 printf 函数的返回值。但是当我退出 SBCL 时,输出文本会神奇地出现在终端上。
最后一行,“hello$”表示当从 SBCL 退出时,文本“hello”出现在终端上,后面跟着 shell 提示符“$”。那么 printf 将文本“hello”打印到哪里呢?
我在 *standard-output* 上尝试了 `finish-output'、`force-output' 但这不起作用。
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',转换失败。
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)
这是代码: