Common Lisp& CFFI:修改全局变量

时间:2016-09-29 11:02:33

标签: common-lisp cffi

我的目标是修改C全局变量。

假设我有以下C头文件:

/* test.h */
int global_variable;

和C源文件:

/* test.c */
#include "stdio.h"
#include "test.h"

extern int global_variable;
void test(void) {
    FILE *fp;
    fp = fopen("output.txt", "w");
    fprintf(fp, "Global variable: %d\n", global_variable);
}

global_variable正确显示在

生成的共享库中
gcc -c -fPIC test.c
gcc -shared -o libtest.so test.o

我的lisp界面如下所示:

(ql:quickload :cffi)

(cffi:define-foreign-library libtest
    (:unix (:default "./libtest"))
  (t (:default "./libtest")))

(cffi:use-foreign-library libtest)

(cffi:defcvar ("global_variable" *global-variable*) :int)

(cffi:defcfun "test" :void )

我可以在没有错误的情况下调用test,但是我无法使用

修改global_variable
(setf *global-variable* 42)

我得到一个警告未定义变量,然后定义(我假设)一个新变量。

所以问题是如何修改常见的lisp(sbcl)中的global_variable?

提前谢谢!

1 个答案:

答案 0 :(得分:0)

对于你的结构,这样的东西应该有效:

(cffi:with-foreign-object (ptr 'block)
        ;; setf the slots
        (setf (cffi:foreign-slot-value ptr 'block 'a) 12) ...etc.