CLisp 14:在LISP中用FFI调用C语言的程序-成功了

用C代码实现一个DLL,可以用VC创建一个工程,让它生成lispcall.dll,导出一个整形变量和一个函数,函数里面随便写点什么。
LISPC_API extern int x;
LISPC_API int f(int v) { return v*v; }

 

再创建一个LISP源文件,写上下面代码
(defpackage ffi-test (:use common-lisp ffi))

(in-package ffi-test)

(default-foreign-language :stdc)

(def-c-var cx (:name "x") (:type int)
  (:library "lispcall\\lispcall.dll"))

(def-call-out cf (:name "f")
  (:arguments (v int))
  (:return-type int)
  (:library "lispcall\\lispcall.dll"))

 

在LISP命令行中加载上面LISP代码,没有报错。为了表明DLL其作用,可以在LISP代码后面加上下面内容,再加载时就能看到错误:FFI::FIND

-FOREIGN-FUNCTION: no dynamic object named "g" in library "lispcall\\lispcall.dll".
(def-call-out cg (:name "g")
  (:arguments)
  (:return-type nil)
  (:library "lispcall\\lispcall.dll"))

 

现在来测试一下,执行(ffi-test::cf 3),虽然有点慢,还真的返回9了!
说明,函数cf定义在包ffi-test中,而且默认是私有的,只能用ffi-test::cf访问。如果声明是公有的,则可以用ffi-test:cf访问。要改成公

有的,可以修改defpackage语句
(defpackage ffi-test
  (:use common-lisp ffi)
  (:export :cf :cx))

 

再来看一下整形变量x有没有起作用,可以在LISP中设置x的值,然后让函数f返回和x相关的值,例如
int f(int v) { return x * v; }
重新编译DLL,重新启动LISP程序,加载LISP代码后,测试
ffi-test:cx 返回0,因为C代码中的全局变量会被初始化为0
(setq ffi-test:cx 7) 返回7
(ffi-test:cf 3) 返回21
(setq ffi-test:cx -13) 返回-13
(ffi-test:cf 2) 返回-26
哦,它工作了!

 

你可能感兴趣的:(CLisp 14:在LISP中用FFI调用C语言的程序-成功了)