моей целью является изменение глобальной переменной C.Common Lisp & CFFI: изменение глобальной переменной
Предполагая, что у меня есть следующий заголовочный файл 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)
Я могу назвать тест без ошибок, но я не могу изменить global_variable с
(setf *global-variable* 42)
я получаю предупреждение неопределенной переменной, а затем определяет (я предполагаю) новую переменную.
Итак, вопрос в том, как изменить global_variable в общем lisp (sbcl)?
Спасибо заранее!
Я мог бы написать функцию C, например, void set_g (int g) {global_variable = g;}, установив global_variable, а затем напишите интерфейс в общем lisp для set_g. Но я полагаю, что должен быть другой путь. – Dimitris
Кажется, это работает для меня после того, как я добавил отсутствующую функцию fclose (fp); 'в функцию C. – jkiiski
Большое вам спасибо! – Dimitris