我试图使用lisp端的wayland,这是我的代码:
(define-foreign-library wayland-client
(:unix (:or "libwayland-client.so.0.20.0" "libwayland-client.so"))
(t (:default "libwayland-client")))
(use-foreign-library wayland-client)
(defcfun "wl_display_connect" :pointer
(name :string))
(wl-display-connect (null-pointer));;return NULLC中的代码,来自这里
#include <stdio.h>
#include <stdlib.h>
#include <wayland-client.h>
struct wl_display *display = NULL;
int main(int argc, char **argv) {
display = wl_display_connect(NULL);
if (display == NULL) {
fprintf(stderr, "Can't connect to display\n");
exit(1);
}
printf("connected to display\n");
wl_display_disconnect(display);
printf("disconnected from display\n");
exit(0);
}我已经测试了C语言,它起作用了,lisp的测试应该如何正确?
wl_display_connect是如何从这里定义的
struct wl_display* wl_display_connect(const char *name)发布于 2022-03-10 12:11:12
我不是CFFI方面的专家,但我认为诀窍是说事情是(:pointer :char)s而不是:strings。
#include <stdio.h>
char *ts(char *x) {
if (x == NULL) {
printf("Got a null\n");
}
return x;
}而这份CFFI声明:
(defcfun (ts "ts")
(:pointer :char)
(name (:pointer :char)))那么,这将是可行的:
> (null-pointer-p (ts (null-pointer)))
Got a null
t然后,您可以使用外部字符串调用它,但是您需要处理分配和释放它们:(ts "foo")不能工作。但这将:
(defun ts-wrapper (s)
(with-foreign-string (x s)
(foreign-string-to-lisp (ts x))))现在:
> (ts-wrapper "foo")
"foo"
3显然,在您的情况下,您不需要处理来自外部字符串的转换。
https://stackoverflow.com/questions/71409336
复制相似问题